unix网络编程(1)---客户端-服务器第一版
发布时间:2020-12-15 18:20:23 所属栏目:安全 来源:网络整理
导读:个人认为《Unix网络编程》前4章可以好好看几遍,不用先着急编程。另外个人感觉作者提供的源码封装太重,不如自己基于原始库函数编写客户端以及服务器。 在了解了前四章的主要知识点后,比如socket、bind、connect、listen、accept等函数后,对网络编程有了一
个人认为《Unix网络编程》前4章可以好好看几遍,不用先着急编程。另外个人感觉作者提供的源码封装太重,不如自己基于原始库函数编写客户端以及服务器。 在了解了前四章的主要知识点后,比如socket、bind、connect、listen、accept等函数后,对网络编程有了一定的了解后,就可以参考第5章来写自己的客户端和服务器了。对于新手来说这里比较抽象,而且很多地方绕来绕去容易绕晕。 这篇文章我就从第5章开始,仿照书上的demo写一个可以直接在单机上运行的cli-ser程序。 ? 以下是server的对应程序:server.c 1 #include <unistd.h> 2 #include <stdlib.h> 3 #include <errno.h> 4 5 #define MAXLINE 1024 6 7 extern int errno; 8 9 void str_echo(int); 10 11 int main() { 12 int sockfd; 13 sockfd = socket(AF_INET,SOCK_STREAM,0); 14 15 struct sockaddr_in servaddr,cliaddr; 16 bzero(&servaddr,sizeof(servaddr)); 17 servaddr.sin_family = AF_INET; 18 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 19 servaddr.sin_port = htons(7070); 20 bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); 21 listen(sockfd,1024); 22 23 for (;;) { 24 int connfd,childPid; 25 socklen_t len = sizeof(cliaddr); 26 connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len); 27 28 if ((childPid = fork()) == 0) { 29 close(sockfd); 30 printf("connected with client.n"); 31 str_echo(connfd); 32 exit(0); 33 } 34 } 35 36 printf("server end!n"); 37 return 0; 38 } 39 40 void str_echo(int sockfd) { 41 ssize_t n; 42 char buf[MAXLINE]; 43 44 again: 45 46 while ((n = read(sockfd,buf,MAXLINE)) > 0) { 47 printf("n:%ldn",n); 48 write(sockfd,n); 49 bzero(buf,MAXLINE); 50 51 if (n < 0 && errno == EINTR) { 52 goto again; 53 } else if (n < 0) { 54 printf("str_echo:read errorn"); 55 } 56 } 57 } 编译:gcc server.c -o server ? 以下是client代码:client.c 1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <stdio.h> 4 #include <string.h> 5 #include <arpa/inet.h> 6 #include <unistd.h> 7 #include <unistd.h> 8 9 #define MAXLINE 1024 10 11 void str_cli(FILE *,int); 12 13 int main() { 14 int sockfd; 15 const char *ip = "127.0.0.1"; 16 in_port_t port = 7070; 17 18 int i = 0; 19 sockfd = socket(AF_INET,0); 20 struct sockaddr_in cliaddr; 21 bzero(&cliaddr,sizeof(cliaddr)); 22 cliaddr.sin_family = AF_INET; 23 inet_aton(ip,&cliaddr.sin_addr); 24 cliaddr.sin_port = htons(port); 25 26 int ret = connect(sockfd,sizeof(cliaddr)); 27 str_cli(stdin,sockfd); 28 29 return 0; 30 } 31 32 void str_cli(FILE *fp,int sockfd) { 33 char sendline[MAXLINE],recvline[MAXLINE]; 34 35 while (fgets(sendline,MAXLINE,fp) != NULL) { 36 write(sockfd,sendline,strlen(sendline)); 37 38 if (read(sockfd,recvline,MAXLINE) == 0) { 39 printf("server terminated prematurelyn"); 40 } 41 fputs(recvline,stdout); 42 bzero(recvline,MAXLINE); 43 } 44 } 编译:gcc client.c -o client (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |