一点细节 关于linux下tcp断开连接时的情况

来源:互联网 发布:热云数据招聘 编辑:程序博客网 时间:2024/05/28 16:08

如果客户端先断开连接,server端再断开,那么server端占用的端口号立马可以用。

但是客户端未断开情况下,server自行关闭,那么占用的端口将进入TIME_WAIT状态而暂时不可使用。


因为主动断开那边会出现TIME_WAIT,而被动断开则不会吗


echoserv.c
#include "mytcplib.h"static void servecho(int connfd, const struct sockaddr_in *cliaddr);int main(int argc, char **argv){int sockfd, connfd;int childpid;int len;struct sockaddr_in servaddr, cliaddr;sockfd = Socket(AF_INET, SOCK_STREAM, 0);memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8081);servaddr.sin_addr.s_addr = INADDR_ANY;Bind(sockfd, (SA *)&servaddr, sizeof(servaddr));Listen(sockfd, LISTENQ);for(;;){len = sizeof(cliaddr);connfd = Accept(sockfd, (SA *)&cliaddr, &len);if((childpid = fork()) == 0){close(sockfd);servecho(connfd,  &cliaddr);close(connfd);exit(0);}else{waitpid(NULL, NULL, NULL);close(connfd);}}}void servecho(int connfd, const struct sockaddr_in *cliaddr){char recv[1024];int n;printf("connection from ip: %s at port: %d\n", inet_ntoa(cliaddr->sin_addr),ntohs(cliaddr->sin_port));while((n = read(connfd, recv, sizeof(recv))) > 0){//if(errno == EINTR)//continue;printf("Received %d bytes , %s\n", n, recv);write(connfd, recv, strlen(recv));memset(recv, 0, sizeof(recv));}printf("Disconnected!\n");}




echocli,c

#include "mytcplib.h"static void cliecho(int sockfd){}int main(int argc, char **argv){int sockfd;struct sockaddr_in servaddr;char buff[1024];int n;sockfd = Socket(AF_INET, SOCK_STREAM, 0);memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8081);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);Connect(sockfd, (SA *)&servaddr, sizeof(servaddr));memset(buff, 0, sizeof(buff));while(fgets(buff, sizeof(buff), stdin) != NULL){printf("%s", buff);buff[strlen(buff) - 1] = 0;write(sockfd, buff, strlen(buff));n = read(sockfd, buff, sizeof(buff));//printf("%d\n",n);snprintf(buff + n, 50 ,"Received %d bytes.\n", n);write(1, buff, strlen(buff));memset(buff, 0, sizeof(buff));}close(sockfd);exit(0);}


原创粉丝点击