第一个C/S程序,为什么完成后,server端口一直显示Time_wait?

DryFisHH DryFisHH 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
开始学习网络编程,写了一个很简单的C/S程序,当server端运行后监听12345端口,client端发过来消息“client messge”,server端收到后返回“server message”,运行一切正常,可是每运行一次client,server机上用netstat -an命令看,发现就会多出一个12345端口显示Time_wait状态,第一个listening的12345端口不变,这是为什么啊?郁闷!

//server
#include <winsock2.h>

int main()
{
SOCKET sock,sockt;
WSADATA wsa;
int iret=0;
char msg[25];
struct sockaddr_in sin;

if(WSAStartup(MAKEWORD(2,2),&wsa))
{
OutputDebugString("WSAStartup Error!");
return 0;
}

if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
{
OutputDebugString("Socket Error!");
return 0;
}

sin.sin_addr.s_addr=htons(INADDR_ANY);
sin.sin_family=AF_INET;
sin.sin_port=htons(12345);

if(bind(sock,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
{
OutputDebugString("Bind Error!");
return 0;
}

if(listen(sock,5)==SOCKET_ERROR)
{
OutputDebugString("Listen Error!");
return 0;
}

while(1)
{
if((sockt=accept(sock,NULL,NULL))==SOCKET_ERROR)
{
OutputDebugString("Accept Error!");
continue;
}


if((iret=recv(sockt,msg,sizeof(msg),0))==SOCKET_ERROR)
{
OutputDebugString("Recv Error!");
closesocket(sockt);
continue;
}

if(strstr(msg,"client message"))
{
memset(msg,0,sizeof(msg));
memcpy(msg,"server message",sizeof(msg)-1);

if((iret=send(sockt,msg,sizeof(msg),0))==SOCKET_ERROR)
{
OutputDebugString("Send Error!");
closesocket(sockt);
continue;
}
}
OutputDebugString("Transport Successfully");
closesocket(sockt);
}

return 0;
}
/////////////////////////////////////////////////////////////////////
//client
#include <winsock2.h>
#include <stdio.h>

int main(int argc,char *argv[])
{
if(argc!=2)
return 0;

WSADATA wsa;
SOCKET sock;
struct sockaddr_in sin;
char msg[25]="client message";
int iret;

if(WSAStartup(MAKEWORD(2,2),&wsa))
{
printf("WSAStartup Error: %d\n",WSAGetLastError());
return -1;
}

if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
{
printf("Socket Error: %d\n",WSAGetLastError());
return -1;
}

sin.sin_addr.s_addr=inet_addr(argv[1]);
sin.sin_family=AF_INET;
sin.sin_port=htons(12345);

if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Connect Error: %d\n",WSAGetLastError());
return -1;
}

if((iret=send(sock,msg,sizeof(msg),0))==SOCKET_ERROR)
{
printf("Send Error: %d\n",WSAGetLastError());
return -1;
}

memset(msg,0,sizeof(msg));
if((iret=recv(sock,msg,sizeof(msg),0))==SOCKET_ERROR)
{
printf("Recv Error: %d\n",WSAGetLastError());
return -1;
}
printf("Re: ");
printf(msg);

closesocket(sock);
WSACleanup();

return 0;
}
...全文
评论 6
收藏 已收藏
分享
返回顶部
DryFisHH
网络编程 18,356 成员 64,161 内容