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

本文探讨了服务器端口在客户端先断开连接与服务器自行关闭两种情况下的使用状态,重点解释了TIME_WAIT状态及其对端口可用性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果客户端先断开连接,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);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值