第一个C/S程序,为什么完成后,server端口一直显示Time_wait?
开始学习网络编程,写了一个很简单的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;
}