点对点 客户端-服务器 聊天程序
生活随笔
收集整理的這篇文章主要介紹了
点对点 客户端-服务器 聊天程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器,客戶端都是父進程、子進程分別負責發送、接收字符串。
另外使用了信號函數來發送和接收處理信號,比如當子進程結束時,傳遞一個信號給父進程,然后父進程會執行信號處理函數。
服務器端:
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<errno.h> 6 #include<netinet/in.h> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<signal.h> 10 11 void handler(int sig)//這是信號處理函數 12 { 13 printf("recv a sig:%d",sig); 14 exit(EXIT_SUCCESS); 15 } 16 17 int main() 18 { 19 int sockfd=socket(AF_INET,SOCK_STREAM,0); 20 if(sockfd<0) perror("socket!!!!"); 21 22 int on=1; 23 int result=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//啟用套接字選項,必須在bind之前完成 24 if(result<0) perror("setsockopt"); 25 26 struct sockaddr_in server_addr; 27 memset(&server_addr,0,sizeof(server_addr)); 28 server_addr.sin_family=AF_INET; 29 server_addr.sin_port=htons(888); 30 server_addr.sin_addr.s_addr=htonl(INADDR_ANY); 31 32 33 int res=bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); 34 if(res<0)perror("bind!!!"); 35 36 res=listen(sockfd,50); 37 if(res<0) perror("listen!!"); 38 39 int conn_fd; 40 struct sockaddr_in peeraddr; 41 int addr_len=sizeof(peeraddr); 42 pid_t pid; 43 44 conn_fd=accept(sockfd,(struct sockaddr*)&peeraddr,&addr_len); 45 if(conn_fd<0)perror("accept!!"); 46 printf(" the ip of client:%s,the port of client:%d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));//打印對等方的ip與端口 47 48 //signal(SIGUSR1,handler); 49 pid=fork(); 50 if(pid<0) 51 perror("fork failed"); 52 else if(pid==0) 53 { //子進程 54 char recvbuf[1024]={0}; 55 while(1) 56 { 57 memset(recvbuf,0,sizeof(recvbuf)); 58 int resu; 59 resu=read(conn_fd,recvbuf,sizeof(recvbuf)); 60 if(resu<0)perror("read"); 61 else if(resu==0) 62 { 63 printf("peer closed!!!!"); 64 //exit(EXIT_SUCCESS); 65 kill(getppid(),SIGUSR1);//發送一個信號給父進程 66 break; 67 } 68 fputs(recvbuf,stdout); 69 } 70 //close(conn_fd); 71 //close(sockfd); 72 exit(EXIT_SUCCESS); 73 } 74 else //父進程 75 { 76 signal(SIGUSR1,handler);//安裝信號接收函數 77 char sendbuf[1024]={0}; 78 while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL) 79 { 80 write(conn_fd,sendbuf,strlen(sendbuf)); 81 memset(sendbuf,0,sizeof(sendbuf)); 82 } 83 //close(conn_fd); 84 //close(sockfd); 85 exit(EXIT_SUCCESS); 86 } 87 return 0; 88 }客戶端:
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<errno.h> 6 #include<netinet/in.h> 7 #include<string.h> 8 #include<stdlib.h> 9 int main() 10 { 11 int sockfd= socket(AF_INET,SOCK_STREAM,0); 12 if(sockfd<0)perror("socket"); 13 14 struct sockaddr_in server_addr; 15 memset(&server_addr,0,sizeof(server_addr)); 16 server_addr.sin_family=AF_INET; 17 server_addr.sin_port=htons(888); //this port number is owned by server,and client's port number is appointed by random 18 server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服務器端的ip地址 19 20 int res=connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); 21 if(res<0)perror("connect!!!!!!!"); 22 23 pid_t pid; 24 pid=fork(); 25 if(pid<0)perror("fork"); 26 if(0==pid)//子進程 27 { 28 char recvbuf[1024]; 29 int ret; 30 while(1) 31 { 32 memset(recvbuf,0,sizeof(recvbuf));//防止空間中的內容干涉,拖泥帶水 33 ret=read(sockfd,recvbuf,sizeof(recvbuf)); 34 if(ret<0)perror("read"); 35 if(ret==0) 36 { 37 printf("peer closed!!!!!!!"); 38 break; 39 } 40 fputs(recvbuf,stdout); 41 } 42 close(sockfd); 43 } 44 else 45 { 46 char sendbuf[1024]; 47 while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){ 48 write(sockfd,sendbuf,strlen(sendbuf)); 49 memset(sendbuf,0,sizeof(sendbuf)); 50 } 51 //exit(EXIT_SUCCESS);} 52 close(sockfd); 53 } 54 return 0; 55 } View Code?
轉載于:https://www.cnblogs.com/chess/p/4684771.html
總結
以上是生活随笔為你收集整理的点对点 客户端-服务器 聊天程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC程序员常用工具篇
- 下一篇: 【微信技术-微信小程序】------ 使