个人认为《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:%ld\n", n); 48 write(sockfd, buf, 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 error\n"); 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, SOCK_STREAM, 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, (struct sockaddr *)&cliaddr, 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 prematurely\n"); 40 } 41 fputs(recvline, stdout); 42 bzero(recvline, MAXLINE); 43 } 44 }
编译:gcc client.c -o client
原文:https://www.cnblogs.com/wangtengxiang/p/10424343.html