问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

linux下的 socket编程问题!

发布网友 发布时间:2022-04-30 20:33

我来回答

3个回答

热心网友 时间:2023-10-10 23:31

第一个问题:

对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。

第二个问题

首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,多线程,select,epoll模型,这个我的blog上有,famdestiny.cublog.cn),不一定要用多进程。

给你写了个代码,自己先看看:

注意,在自己的目录下创建一个叫pserverb的文件,程序会把这个文件复制成test文件。你可以自己根据需要改改

server:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define SERV_PORT 5358
#define MAX_CONN 10
#define BUF_LEN 1024

void str_echo(FILE *fp, int sockfd){
ssize_t nread;
int file_fd;
char buf[BUF_LEN] = {0};

file_fd = open("test", O_WRONLY | O_TRUNC | O_CREAT, 0755);
while(1) {
bzero(buf, BUF_LEN);
if((nread = read(sockfd, buf, BUF_LEN)) == -1) {
if(errno == EINTR) {
continue;
}
else {
printf("readn error: %s\n", strerror(errno));
continue;
}
}
else if (nread == 0) {
break;
}
else {
printf("%s\n", buf);
write(file_fd, buf, nread);
}
}
close(file_fd);
}

void sig_chld(int sig){
pid_t pid;
int state;
while((pid = waitpid(-1, &state, WNOHANG)) > 0){
printf("child process %d exited.", pid);
}
return;
}

int main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t cliaddrlen;
pid_t childpid;
struct sockaddr_in servaddr, cliaddr;

if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
printf("socket error: %s\n", strerror(errno));
return 0;
}

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){
printf("bind error: %s\n", strerror(errno));
return 0;
}

if(listen(listenfd, MAX_CONN) == -1){
printf("listen error: %s\n", strerror(errno));
return 0;
}

signal(SIGCHLD, sig_chld);

while(1){
cliaddrlen = sizeof(cliaddr);
if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen)) == -1){
if(errno == EINTR){
continue;
}
else{
printf("accept error: %s\n", strerror(errno));
continue;
}
}

if((childpid = fork()) == 0){
close(listenfd);
str_echo(stdin, connfd);
exit(0);
}
else if(childpid > 0){
close(connfd);
}
else{
printf("fork error!\n");
continue;
}
}
}

client:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define SERV_ADDR "127.0.0.1"
#define SERV_PORT 5358
#define BUF_LEN 1024

void str_cli(char *path, int sockfd)
{
char sendbuf[BUF_LEN] = {0};
int fd, n;

if((fd = open("./pserverb", O_RDONLY)) == -1){
printf("%s\n", strerror(errno));
exit(0);
}
while((n = read(fd, sendbuf, BUF_LEN)) != 0) {
if(n < 0){
printf("%s\n", strerror(errno));
exit(0);
}
write(sockfd, sendbuf, n);
bzero(sendbuf, BUF_LEN);
}
close(fd);
return;
}

int main(int argc, char **argv)
{
int fd;
struct sockaddr_in servaddr;

fd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_ADDR);
servaddr.sin_port = htons(SERV_PORT);

if (connect(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
printf("connect error: %s\n", strerror(errno));
return 0;
}

str_cli(argv[1], fd);
return 0;
}

热心网友 时间:2023-10-10 23:31

1你就打开文件,然后一个字符一个字符的读文件,然后一个字符一个字符的接收,再一个字符一个字符写入文件就行了阿
2这个问题你问的有点模糊,服务器端的编程有很多方式,也不是要每来个连接就要创建一个进程的。

热心网友 时间:2023-10-10 23:32

挖~
同烂
linux系统中socket编程错误码:eintr和eagain的处理方法

EAGAIN错误常见于非阻塞系统调用,表示由于资源限制或条件未满足,无法完成操作。处理EINTR错误的三种方法包括:重启被中断的系统调用、在信号处理时设置SA_RESTART属性、忽略信号。解决EAGAIN错误则需关注资源限制或条件满足情况,如调整非阻塞操作策略。Linux下,非阻塞socket编程时出现的Resource temporarily unava...

Linux编程socket通信疑问

在Linux编程中,socket通信是一种非常重要的机制,用于在不同进程之间或者不同主机之间传输数据。Socket可以被看作是一个端点,它允许程序通过网络通信协议(如TCP/IP、UDP等)进行数据传输。在socket通信中,通常涉及两个主要的步骤:建立连接和数据传输。首先,客户端和服务器端都需要创建一个socket对象,...

linux系统中socket编程错误码:eintr和eagain的处理方法

在Linux系统中,socket编程中两种常见的错误码——eintr和eagain,是我们在网络编程中不得不面对的挑战。它们分别代表不同的问题,需要我们采取不同的策略来妥善处理。本文将深入探讨这两种错误的含义、原因以及各自的处理方法。首先,我们来理解什么是慢系统调用。这些调用可能会在操作网络、特殊设备或进行长...

linux中socket编程服务端启动,客户端启动是出现错误:connection refuse(1...

你的servaddr里的IP地址或PORT端口号设置错了吧。服务端和客户端的简单里子请参考:http://blog.csdn.net/flynetcn/article/details/5829258

linux下的 socket编程问题!

第一个问题:对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。第二个问题 首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,...

关于socket编程问题,100分急求

1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了。而这些操作都是在socket api级别完成的,不用额外发一个EOF标志。2、客户端包大于服务器缓冲区,这也不是你操心的,api...

Linux下C语言Socket编程问题?(高手进)

网络断开如拔掉网线时,系统程序一般是检测不出来的,尤其是广域网上。建议连接时设置linger属性,如果网络不通,能迅速决断立即返回失败错误。LINGER oLinger;oLinger.l_onoff = 1;oLinger.l_linger = 0;setsockopt(m_Socket,SOL_SOCKET,SO_LINGER,(char *)&amp;oLinger,sizeof(oLinger));...

Linux编程socket通信疑问

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者...答案就在这里:linux socket 通信编程 ---Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的...

linux阻塞与非阻塞linux阻塞非阻塞

以linux下tcpsocket编程为例:阻塞就是recv/read的时候socket接收缓冲区要是有数据就读,没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走...

深度剖析linux socket的epollin/epollout是何时触发的

深入探讨Linux Socket的epollin/epollout触发机制:在EPOLLET模式下,理解socket的EPOLLIN和EPOLLOUT何时触发是关键。EPOLLIN代表可读事件,当有新的TCP数据到达时,这个事件会触发,这是通过内核的sk-&gt;sk_data_ready函数通知epoll的。让我们通过一个实例来分析。编写一个服务端程序,当客户端连接并发送数据时...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
开通饿了么需要交费用吗? 我的胳膊有时候一抬 背后肩胛骨那里会痛 ,脖子 一歪 ,那儿也会疼 是肩... ...那种痛真的很难受,请问是不是肩周炎,我才22岁应该... 我右臂抬不起,酸痛.医生说是肩周炎,吃了好多药,无效果,怎办?_百度... ...现在疼的胳膊都抬不起来,吃点什么药管用啊? ...RPG 好玩的地图啊,我一个人玩单机不要太难的,要好玩点的,防守图难... 肩周炎什么原因一抬胳膊就疼吃什么药who是什么治法 ...痛,胳膊都抬不起来,请问有什么好的治疗方法 求助 魔兽争霸3 适合单人玩的 地图 什么类型都好 不要太难 越多越好 快手退税多久到账 求linux下的socket 编程 在linux下如何用c语言来写一个socket编程的聊天小程序 linux下socket编程,菜鸟求解。。。 天猫博阁诺旗舰店 的 灯具 好么? 质量如何?他们家是属于什么样式的灯具? 吊灯什么牌子好_吊灯十大品牌都有哪些? 《实战Linux Socket编程》txt全集下载 松下灯具旗舰店官网 求一部韩剧下载,2000年的秘密情人(好像也叫“秘密”),金荷娜主演 刘荷娜还演过什么电影? 宋承宪主演的所有电视剧和电影? 请问那位可以让我知道宋承宪的所有资料? 在异地购首套房,由于开发商违约退房了,现在再在深圳买算首套吗?贷款首付几成? 宠物情人30多分钟的时候,金荷娜大腿夹着张根硕的手的那个动作是在干嘛。。。 男子摇中杭州“红盘”却被告知没有资格购买,究竟是怎么回事? 为什么韩彩英、金荷娜主演的Magzine Allo暂停制作了? 金荷娜几岁了? 杭州租客退租惹纠纷,外出租房时需要注意哪些问题? 杭州李女士付完定金发现房龄老了6岁,她应如何维护自己的合法权益? 关于经济适用房的购买及退房规定,请了解的朋友跟我说下,谢谢了! 请问这个是在欧普照明天猫旗舰店买的灯是真的么? linux下socket编程,多线程问题 关于linux socket编程的问题,在线等!! 求帮助,万分感谢! linux编程socket程序的编译语句 关于linux socket编程的问题 梦见父亲骑自行车比赛中途掉窨井里受伤 梦见街道在自行车比赛,街道两旁人声鼎沸,欢呼声不断? 梦到有人跟我比赛骑自行车,并且超过我还要打我是什么意思 梦见我和别人骑自行车比赛发现我骑的是一只大兔子? 为什么做梦梦到和别人比赛骑自行车,醒了之后发现自己真的很累呢?? 梦见我姨村弄了个自行车比赛有4人参加结果死了3不? 美颜相机照出来是老人的特效 什么相机里的特效 cymera特效相机有什么功能 哪款特效相机可以提照片? 2021年最热门的专业有哪些 特效相机软件哪个好玩 能加特效的相机是什么相机? 男生学什么专业有用,近几年比较热门? 请问这个用的是什么特效相机啊,跪求 最近几年都有哪些热门专业?以及冷专业?(文科)
  • 焦点

最新推荐

猜你喜欢

热门推荐