如果客户端先断开连接,server端再断开,那么server端占用的端口号立马可以用。
但是客户端未断开情况下,server自行关闭,那么占用的端口将进入TIME_WAIT状态而暂时不可使用。
因为主动断开那边会出现TIME_WAIT,而被动断开则不会吗
#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);
}