2.3 TCP协议下并发性问题
head.h
1 #ifndef __HEAD_H__ 2 #define __HEAD_H__ 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <sys/socket.h> 8 #include <sys/types.h> 9 #include <arpa/inet.h> 10 #include <netinet/in.h> 11 #include <netinet/ip.h> 12 #include <unistd.h> 13 #include <error.h> 14 #include <errno.h> 15 16 #define error_exit(_errmsg_) error(EXIT_FAILURE, errno, _errmsg_) 17 #define SER_PORT 50000 18 #define SER_ADDR "192.168.239.129" 19 20 #endif
Makefile
1 ALL:server client 2 3 server:server.c 4 gcc $< -o $@ 5 client:client.c 6 gcc $< -o $@ 7 .PHONY: 8 clean: 9 rm server client
client.c
1 #include "head.h" 2 3 int main(void) 4 { 5 int sockfd = 0; 6 struct sockaddr_in seraddr; 7 char buff[] = "hello world!"; 8 char ret[1024] = {0}; 9 10 seraddr.sin_family = AF_INET; 11 seraddr.sin_port = htons(SER_PORT); 12 seraddr.sin_addr.s_addr = inet_addr(SER_ADDR); 13 14 if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) 15 error_exit("fail to socket"); 16 if (-1 == (connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)))) 17 error_exit("fail to connect"); 18 19 sleep(10); 20 21 if (-1 == send(sockfd, buff, strlen(buff)+1, 0)) 22 error_exit("fail to send"); 23 24 if (-1 == recv(sockfd, &ret, sizeof(ret), 0)) 25 error_exit("fail to recv"); 26 printf("ret = %s\n", ret); 27 28 close(sockfd); 29 30 return 0; 31 }
server.c
1 #include "head.h" 2 3 int main(void) 4 { 5 int sockfd = 0; 6 int confd = 0; 7 char ret[1024] = {0}; 8 struct sockaddr_in seraddr,cltaddr; 9 socklen_t addrlen; 10 11 seraddr.sin_family = AF_INET; 12 seraddr.sin_port = htons(SER_PORT); 13 seraddr.sin_addr.s_addr = inet_addr(SER_ADDR); 14 15 if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) 16 error_exit("fail to socket"); 17 if (-1 == bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr))) 18 error_exit("fail to bind"); 19 if (-1 == listen(sockfd, 10)) 20 error_exit("fail to listen"); 21 22 while (1) 23 { 24 if (-1 == (confd = accept(sockfd, (struct sockaddr *)&cltaddr, &addrlen))) 25 error_exit("fail to socket"); 26 27 if (-1 == recv(confd, ret, sizeof(ret), 0)) 28 error_exit("fail to recv"); 29 printf("RECV:%s\n", ret); 30 strcat(ret, "----echo"); 31 32 if (-1 == (send(confd, ret, strlen(ret)+1, 0))) 33 error_exit("fail to send"); 34 } 35 36 close(confd); 37 close(sockfd); 38 39 return 0; 40 }

浙公网安备 33010602011771号