一、基于TCP的网络编程(续day12)
二、并发服务器
三、基于UDP的网络编程
一、基于TCP的网络编程(续day12)
1、昨天的例子客户端只能向指定的服务器端发送数据,可以利用主函数参数传递命令行参数,从而接收任意服务器地址。同时也可以实现两台机器之间的通信(可以事先使用ping命令查看是否通)
2、也可以使用while循环在客户端不断接收数据输入,知道特定字符结束输入关闭通讯,如使用fgets,或gets
#if 0
...
#endif
可以进行条件注释
基于TCP的服务器:
#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> int main() { int listenfd = socket (AF_INET, SOCK_STREAM, 0); if (listenfd == -1) { perror ("socket"); exit (EXIT_FAILURE); } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons (8888); addr.sin_addr.s_addr = INADDR_ANY; if (bind (listenfd, (struct sockaddr*)&addr, sizeof (addr)) == -1) { perror ("bind"); exit (EXIT_FAILURE); } if (listen (listenfd, 1024) == -1) { perror ("listen"); exit (EXIT_FAILURE); } struct sockaddr_in addrcli = {}; socklen_t addrlen = sizeof (addrcli); int connfd = accept (listenfd, (struct sockaddr*)&addrcli, &addrlen); if (connfd == -1) { perror ("accept"); exit (EXIT_FAILURE); } printf ("服务器已接受来自%s:%hu客户机的连接请求 ", inet_ntoa (addrcli.sin_addr),ntohs (addrcli.sin_port)); char buf[1024]; ssize_t rcvd = recv (connfd, buf, sizeof (buf), 0); if (rcvd == -1) { perror ("recv"); exit (EXIT_FAILURE); } if (rcvd == 0) { printf ("客户机已关闭连接 "); exit (EXIT_FAILURE); } buf[rcvd] = '