客户端向服务器发出连接请求后,服务器端写入数据发送给客户端,在客户端显示。
server:
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <errno.h> 4 #include <string.h> 5 #include <netdb.h> 6 #include <sys/types.h> 7 #include <netinet/in.h> 8 #include <sys/socket.h> 9 #include <unistd.h> 10 11 #define MAXSIZE 1024 12 13 int main(int argc, char* argv[]) 14 { 15 int sockfd, new_fd; 16 struct sockaddr_in server_addr; 17 struct sockaddr_in client_addr; 18 int sin_size, portnumber; 19 char buf[MAXSIZE]; 20 if(argc != 2) 21 { 22 fprintf(stderr,"Usage: %s portnumbera ",argv[0]); 23 exit(1); 24 } 25 if((portnumber = atoi(argv[1]))<0) 26 { 27 /*获得命令行的第二个参数端口号,atoi()把字符串转换成整形数*/ 28 fprintf(stderr,"usage: %s portnumbera ",argv[0]); 29 exit(1); 30 } 31 /*服务器开始建立socket描述符*/ 32 sockfd = socket(AF_INET,SOCK_STREAM,0); 33 34 /*服务器端填充sockaddr结构*/ 35 bzero(&server_addr,sizeof(struct sockaddr_in)); 36 server_addr.sin_family=AF_INET; 37 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 38 server_addr.sin_port = htons(portnumber); 39 40 /*调用bind函数绑定端口*/ 41 bind(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr)); 42 43 /*监听sockfd描述符,同时处理的最大链接请求数为5*/ 44 listen(sockfd,5); 45 46 /*服务器阻塞,等待接收链接请求,直到客户端发送链接请求*/ 47 while(1) 48 { 49 sin_size = sizeof(struct sockaddr_in); 50 /*调用accept接受一个连接请求*/ 51 if((new_fd = accept(sockfd,(struct sockaddr*)(&client_addr),&sin_size))==-1) 52 { 53 printf("accept error! "); 54 exit(1); 55 } 56 /*TCP链接已建立,打印申请链接的客户机的IP地址*/ 57 printf("Server get connection from %d ",inet_ntoa(client_addr.sin_addr)); 58 /*提示用户输入要发送的数据,长度小于缓冲区的长度*/ 59 printf("Connected successful, please input the message[less than 1024 bytes]: "); 60 61 /*从终端输入要发送的数据,放到buf缓冲区*/ 62 fgets(buf,sizeof(buf),stdin); 63 64 /*调用write发送数据*/ 65 if(write(new_fd,buf,strlen(buf))==-1) 66 { 67 printf("write error! "); 68 exit(1); 69 } 70 close(new_fd); 71 } 72 close(sockfd); 73 return 0; 74 }
client:
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <errno.h> 4 #include <string.h> 5 #include <netdb.h> 6 #include <sys/types.h> 7 #include <netinet/in.h> 8 #include <sys/socket.h> 9 10 int main(int argc, char* argv[]) 11 { 12 int sockfd; 13 char buffer[1024]; 14 /*定义服务器端套接口数据结构*/ 15 struct sockaddr_in server_addr; 16 struct hostent *host; 17 int portnumber, nbytes; 18 if(argc!=3) 19 { 20 printf("Usage: %s hostname portnumbera ",argv[0]); 21 exit(1); 22 } 23 /*获得命令行的第二个参数--主机名*/ 24 if((host=gethostbyname(argv[1]))==NULL) 25 { 26 printf("get host name error "); 27 exit(1); 28 } 29 /*获得第三个参数,端口号*/ 30 if((portnumber = atoi(argv[2]))<0) 31 { 32 printf("port number error "); 33 exit(1); 34 } 35 /*客户程序开始建立sockfd描述符*/ 36 if((sockfd = socket(AF_INET,SOCK_STREAM,0))==01) 37 { 38 printf("socket error "); 39 exit(1); 40 } 41 /*客户程序填充服务端资料*/ 42 bzero(&server_addr,sizeof(server_addr)); 43 server_addr.sin_family = AF_INET; 44 server_addr.sin_port = htons(portnumber); 45 server_addr.sin_addr = *((struct in_addr*)host->h_addr); 46 /*客户程序发起连接请求*/ 47 connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr)); 48 49 /*调用read读取服务器发送来的数据*/ 50 if((nbytes = read(sockfd,buffer,1024))==-1) 51 { 52 printf("read error "); 53 exit(1); 54 } 55 buffer[nbytes] = '