多进程解决socket并发问题
socket程序只能实现服务器连接一个客户端,不能解决并发问题,及多个客户端同时连接。下面的程序采用多进程的思想,在accept()调用之后利用fork()产生子进程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define SERV_PORT 9998 #define MAXLINE 4096 int main( int argc, char ** argv) { int socket_fd, connect_fd; struct sockaddr_in servaddr; char buf[MAXLINE],sendbuf[MAXLINE]; int len; pid_t pid; if ( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf ( "create socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } //初始化 memset (&servaddr, 0, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。 servaddr.sin_port = htons(SERV_PORT); //调用bind函数,绑定 if ( bind(socket_fd, ( struct sockaddr*)&servaddr, sizeof (servaddr)) <0) { printf ( "bind socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } //调用listen函数监听端口 if ( listen(socket_fd, 10) <0) { printf ( "listen socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } printf ( "waiting for client's connection......\n" ); //调用fork函数实现多进程,注意accept函数在fork调用之后 if (pid=fork()<0) { perror ( "fork " ); exit (-1); } if (pid==0) { connect_fd = accept(socket_fd,( struct sockaddr*)NULL,NULL); while ((len= recv(connect_fd, buf, MAXLINE, 0))>0) { printf ( "receive message from client: %s\n" , buf); //向客户端发送回应数据 printf ( "send message to client: \n" ); fgets (sendbuf, 4096, stdin); if ( send(connect_fd, sendbuf, strlen (sendbuf), 0) < 0) { printf ( "send messaeg error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } } } close(connect_fd); close(socket_fd); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了