linux TCP/IP网络编程(多进程)
2012-12-08 21:21
120 查看
多进程网络编程案例如下
:
#include <stdio.h> #include <errno.h> #include <netdb.h> #include <sys/socket.h> // may be use by getpid() and getppid() #include <unistd.h> int main(int argc, char *argv[]) { int sockfd,new_fd, mypid; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]="Hello! Are You Fine?"; char buf[1024]; int flag; if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } /* 服务器端开始建立socket描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ if(listen(sockfd,5)==-1) { fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); exit(1); } // printf my PID num printf("Starting Server at port: %d Success. My PID is: %d\nAccepting Request...\n", portnumber, getpid()); while(1) { /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) { fprintf(stderr,"Accept error:%s\n\a",strerror(errno)); exit(1); } // 生成一个子进程来完成和客户端的会话,父进程继续监听 if (!fork()) { // print my PID and my parent PID mypid = getpid(); printf("Accepting new connection...\nNow I will server for you. My PID is: %d\nMy parent PID is: %d\n", mypid, getppid()); // 子进程,关闭父进程监听套接字 close(sockfd); fprintf(stderr,"Server get connection from %s\n", inet_ntoa(client_addr.sin_addr)); if(write(new_fd,hello,strlen(hello))==-1) { fprintf(stderr,"Write Error:%s\n",strerror(errno)); exit(1); } while(1) //get data from client { if((flag=read(new_fd,buf,1024))<0) { printf("Reading data error"); break; } if(flag==0) { printf("[PID:%d] Ending current connection\n",mypid); break; } else { printf("[PID:%d] -->%s\n",mypid,buf); if(strstr(buf,"exit")) { printf("I get 'exit' string, so close client connection\n"); break; } } } //end while (get data from client) // 连接丢失,结束进程 (客户主动断开,网络问题自动断开) printf("Connection lose. End child program, PID: %d\n", getpid()); close(new_fd); exit(0); } // if fork // 父进程关闭新套接字,继续监听请求 close(new_fd); } //while close(sockfd); exit(0); }
:
相关文章推荐
- Linux应用编程基础--(4)多进程基础1
- 【Linux网络编程】基于TCP多进程(fork)版本客户端/服务器
- Linux_4.2_多进程程序设计
- 【Linux】使用gdb调试多进程&多线程
- linux c socket之多进程任务
- TCP/IP网络编程 基于Linux编程_3 --优于select的epoll
- Linux下多进程避免僵尸进程的方法
- linux gdb 调试多线程 多进程 显示宏
- 【面试常见题目之后台知识】Linux多线程与多进程区别全方位解读+程序实例
- linux多核多进程访问文件示例程序(每个核上运行一个程序)
- Linux并发服务器编程之多进程并发服务器
- Linux 多进程与多线程
- python在linux下使用多进程遇到3770问题解决方法
- TCP/IP网络编程 基于Linux编程_2 --I/O流分离的半关闭问题
- linux应用编程笔记(8)多进程程序设计
- Linux下使用gdb调试多进程与多线程程序
- Linux 创建多进程 & 线程时的进程栈段处理
- TCP/IP网络编程 基于Linux编程_3 --优于select的epoll
- linux下多进程、多线程编程
- Linux多进程实例与代码优化