网站参数设定,搭建直播网站需要怎么做,石家庄做网站建设,新品销售网站建设《TCP关闭的两种方法概述》里边理论基础#xff0c;下边是列出代码#xff0c;并且进行实验。 服务端代码graceserver.c的内容如下#xff1a;
#include lib/common.hstatic int count;static void sig_int(int signo) {printf(\nreceived %d datagrams\…《TCP关闭的两种方法概述》里边理论基础下边是列出代码并且进行实验。 服务端代码graceserver.c的内容如下
#include lib/common.hstatic int count;static void sig_int(int signo) {printf(\nreceived %d datagrams\n, count);exit(0);
}int main(int argc, char **argv) {int listenfd;listenfd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in server_addr;bzero(server_addr, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr htonl(INADDR_ANY);server_addr.sin_port htons(SERV_PORT);int rt1 bind(listenfd, (struct sockaddr *) server_addr, sizeof(server_addr));if (rt1 0) {error(1, errno, bind failed );}int rt2 listen(listenfd, LISTENQ);if (rt2 0) {error(1, errno, listen failed );}signal(SIGINT, sig_int);signal(SIGPIPE, SIG_IGN);int connfd;struct sockaddr_in client_addr;socklen_t client_len sizeof(client_addr);if ((connfd accept(listenfd, (struct sockaddr *) client_addr, client_len)) 0) {error(1, errno, bind failed );}char message[MAXLINE];count 0;for (;;) {int n read(connfd, message, MAXLINE);if (n 0) {error(1, errno, error read);} else if (n 0) {error(1, 0, client closed \n);}message[n] 0;printf(received %d bytes: %s\n, n, message);count;char send_line[MAXLINE];sprintf(send_line, Hi, %s, message);sleep(5);int write_nc send(connfd, send_line, strlen(send_line), 0);printf(send bytes: %zu \n, write_nc);if (write_nc 0) {error(1, errno, error write);}}
}客户端代码graceclient.c内容如下
# include lib/common.h
# define MAXLINE 4096int main(int argc, char **argv) {if (argc ! 2) {error(1, 0, usage: graceclient IPaddress);}int socket_fd;socket_fd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in server_addr;bzero(server_addr, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(SERV_PORT);inet_pton(AF_INET, argv[1], server_addr.sin_addr);socklen_t server_len sizeof(server_addr);int connect_rt connect(socket_fd, (struct sockaddr *) server_addr, server_len);if (connect_rt 0) {error(1, errno, connect failed );}char send_line[MAXLINE], recv_line[MAXLINE 1];int n;fd_set readmask;fd_set allreads;FD_ZERO(allreads);FD_SET(0, allreads);FD_SET(socket_fd, allreads);for (;;) {readmask allreads;int rc select(socket_fd 1, readmask, NULL, NULL, NULL);if (rc 0)error(1, errno, select failed);if (FD_ISSET(socket_fd, readmask)) {n read(socket_fd, recv_line, MAXLINE);if (n 0) {error(1, errno, read error);} else if (n 0) {error(1, 0, server terminated \n);}recv_line[n] 0;fputs(recv_line, stdout);fputs(\n, stdout);}if (FD_ISSET(0, readmask)) {if (fgets(send_line, MAXLINE, stdin) ! NULL) {if (strncmp(send_line, shutdown, 8) 0) {FD_CLR(0, allreads);if (shutdown(socket_fd, 1)) {error(1, errno, shutdown failed);}} else if (strncmp(send_line, close, 5) 0) {FD_CLR(0, allreads);if (close(socket_fd)) {error(1, errno, close failed);}sleep(6);exit(0);} else {int i strlen(send_line);if (send_line[i - 1] \n) {send_line[i - 1] 0;}printf(now sending %s\n, send_line);size_t rt write(socket_fd, send_line, strlen(send_line));if (rt 0) {error(1, errno, write failed );}printf(send bytes: %zu \n, rt);}}}}}代码如上想要跟我一样编译以后进行测试的话需要先参考《网络编程实战课程使用Cmake第一次编译程序》进行编译之后再来验证套接字上的close和shutdown两个函数。
实验一
在其中一个终端输入./graceserver然后按下一个回车打开服务器程序。 之后再打开一个终端输入./graceclient 127.0.0.1然后按下一个回车打开客户端程序然后先验证套接字的close函数快速在5秒内输出data1、data2和close三个字符串。 可以看到close函数直接就把客户端套接字的读写两个方向都关闭了。
实验二
在其中一个终端输入./graceserver然后按下一个回车打开服务器程序。 之后再打开一个终端输入./graceclient 127.0.0.1然后按下一个回车打开客户端程序然后先验证套接字的close函数快速在5秒内输出data1、data2和shutdown三个字符串。 这里可以看到shutdown只是先把客户端写方向关闭但是读的方向还打开着这就是为什么还能接受到服务器端的Hi, data1和Hi, data2两个字符串。
此文章为11月Day 11学习笔记内容来源于极客时间《网络编程实战》。