加入fork()的区别(执行结果)
server2.c
#include <sys/socket.h> #include <netinet/in.h> int main(int argc,char **argv){ int sockfd; sockfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port = htons(8000); sin.sin_addr.s_addr = htonl(INADDR_ANY); //配置本地信息,使socket与本机地址及端口号绑定 bind(sockfd,(struct sockaddr *)&sin,sizeof(sin)); perror("bind"); //监听并建立输入队列,限制最大请求数 listen(sockfd,10); perror("listen"); struct sockaddr_in pin; int address_size = sizeof(pin); int temp_sockfd; char *msg="Hello!"; while(1){ printf("accept……sockfd %d\n",sockfd); //接收连接请求,建立一个新socket temp_sockfd = accept(sockfd,(struct sockaddr *)&pin,&address_size); printf("accept……temp_sockfd %d\n",temp_sockfd); //在新socket上进行数据传输 if(send(temp_sockfd,msg,strlen(msg),0)==-1){ perror("send"); exit(1); } //建立子进程 if(!fork()){ //接收客户端的信息 char recvserver[256]; memset(recvserver,0,256); printf("%s %d\n",recvserver,strlen(recvserver)); recv(temp_sockfd,recvserver,sizeof(recvserver),0); printf("%s %d\n",recvserver,strlen(recvserver)); close(temp_sockfd); exit(0); } close(temp_sockfd); } }
server3.c(不加fork)
#include <sys/socket.h> #include <netinet/in.h> int main(int argc,char **argv){ int sockfd; sockfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port = htons(8000); sin.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd,(struct sockaddr *)&sin,sizeof(sin)); perror("bind"); listen(sockfd,10); perror("listen"); struct sockaddr_in pin; int address_size = sizeof(pin); int temp_sockfd; char *msg="Hello!"; while(1){ printf("accept……sockfd %d\n",sockfd); temp_sockfd = accept(sockfd,(struct sockaddr *)&pin,&address_size); printf("accept……temp_sockfd %d\n",temp_sockfd); if(send(temp_sockfd,msg,strlen(msg),0)==-1){ perror("send"); exit(1); } //接收客户端的信息 char recvserver[256]; memset(recvserver,0,256); printf("%s %d\n",recvserver,strlen(recvserver)); recv(temp_sockfd,recvserver,sizeof(recvserver),0); printf("%s %d\n",recvserver,strlen(recvserver)); close(temp_sockfd); } }
执行结果:
[wangcm@wang socket]$ ./server3
bind: Success
listen: Success
accept……sockfd 3
accept……temp_sockfd 4
0
server,hello!I am client! 25
accept……sockfd 3
[wangcm@wang socket]$ ./server2
bind: Success
listen: Success
accept……sockfd 3
accept……temp_sockfd 4
accept……sockfd 3
0
server,hello!I am client! 25
客户端:client2.c
#include <stdio.h> #include <netinet/in.h> #include <sys/socket.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <string.h> #include <dirent.h> #include <netdb.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc,char **argv){ char *host_name="127.0.0.1"; struct hostent *server_host_name; server_host_name=gethostbyname(host_name); int sockfd; //建立socket sockfd=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in pin; pin.sin_family=AF_INET; pin.sin_addr.s_addr = ((struct in_addr *)(server_host_name->h_addr))->s_addr; pin.sin_port=htons(8000); //建立连接,之前先赋值 connect(sockfd,(struct sockaddr *)&pin,sizeof(pin)); perror("send"); char buffer[256]; //memset()是内存赋值函数,用来给某一内存空间赋值, //memset(void* _dst,int val,int len),_dst是目标起始地址,val是要赋的值,len要赋值的字节数 memset(buffer,0,256); printf("%s %d\n",buffer,strlen(buffer)); //接收数据 recv(sockfd,buffer,sizeof(buffer),0); printf("%s %d\n",buffer,strlen(buffer)); //传输数据 char *sendserver="server,hello!I am client!"; if(send(sockfd,sendserver,strlen(sendserver),0)==-1){ perror("send"); exit(1); } close(sockfd); }