并發服務器設計
并發服務器就是能夠同時處理多個客戶端請求的服務器。并發服務器可通過多進程或者多線程程序來實現,這里采用多進程程序。
服務器
#include<stdio.h>include<stdlib.h>
include<string.h>
include<unistd.h>
include<sys/types.h>
include<sys/socket.h>
include<netinet/in.h>/定義了struct sockaddr_in/
void main() { int sockfd; /創建socket/ sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { printf("create socket false"); exit(1);
} /綁定地址/ struct sockaddr_in server_addr; server_addr.sin_family=AF_INET; server_addr.sin_port=htons(5000); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sockfd,(const struct sockaddr )(&server_addr),sizeof(server_addr))==-1) { printf("bind false"); exit(1);
} /監聽端口/ listen(sockfd,3); /父進程等待連接,成功連接后創建子進程收發數據/ int newfd; struct sockaddr_in client_addr; int addrlen=sizeof(client_addr); char buf[128]; pid_t pid; while(1) { newfd=accept(sockfd,(struct sockaddr )(&client_addr),&addrlen); pid=fork(); if(pid==0) { while(1) { recv(newfd,buf,128,0); printf("the message is from :%s\n",inet_ntoa(client_addr.sin_addr)); printf("the message received is %s\n",buf); if(strcmp(buf,"exit")==0) { break;
}} close(newfd); close(sockfd); exit(0); } } /*結束連接*/ close(newfd); close(sockfd);
}</pre>
客戶端
#include<stdio.h>include<stdlib.h>
include<string.h>
include<unistd.h>
include<sys/types.h>
include<sys/socket.h>
include<netinet/in.h>/定義了struct sockaddr_in/
void main() { /創建socket/ int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { printf("create socket false"); exit(1);
} /連接服務器/ struct sockaddr_in server_addr; server_addr.sin_family=AF_INET; server_addr.sin_port=htons(5000); server_addr.sin_addr.s_addr=inet_addr("192.168.137.246"); if(connect(sockfd,(const struct sockaddr )(&server_addr),sizeof(server_addr))==-1) { printf("connect false"); exit(1);
} /收發數據/ printf("please enter your message,and exit for exit\n"); char buf[128]; while(1) { scanf("%s",buf); send(sockfd,buf,128,0); if(strcmp(buf,"exit")==0) break; } /結束連接*/ close(sockfd); }</pre>
來自:http://blog.csdn.net/u011012049/article/details/47452669