SOCKET客户端可以connect一次,发送接收累次吗
SOCKET客户端可以connect一次,发送接收多次吗?
SOCKET客户端可以connect一次,发送接收多次吗?下面代码已经WSAStartup()
客户端代码:
sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2200);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
start=true;
while(1)
{
char* recvBuf=new char[500];
ZeroMemory(recvBuf,500);
int recvcount=recv(sockClient,recvBuf,500,0);
if((strlen(recvBuf)>0)&&(recvcount!=0)&&(recvcount!=SOCKET_ERROR))
{
char* text=new char[GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text,GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500);
strcat(text,recvBuf);
Sleep(300);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text);
SetForegroundWindow(hWnd);
delete[] text;
text=NULL;
}
delete[] recvBuf;
recvBuf=NULL;
// closesocket(sockClient);
}
服务端代码:
HWND hWnd = AfxGetMainWnd()->m_hWnd;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup( wVersionRequested, &wsaData );
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2200);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//
start=true;
fd_set fdSocket; // 所有可用套节字集合
FD_ZERO(&fdSocket);
FD_SET(sockSrv, &fdSocket);
while(1)
{
fd_set fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
if(nRet>0)
{
if(FD_ISSET(sockSrv, &fdRead))
{
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
//::AfxMessageBox("已经ACCEPT!");
FD_SET(sockConn, &fdSocket);
}
else
{
char* recvBuf=new char[500];
ZeroMemory(recvBuf,500);
int recvcount=recv(sockConn,recvBuf,500,0);
if(recvcount>0)
{
char* text=new char[GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text,GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+501);
strcat(text,recvBuf);
Sleep(300);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text);
SetForegroundWindow(hWnd);
delete[] text;
text=NULL;
}
else
{
closesocket(sockConn);
FD_CLR(sockConn, &fdSocket);
FD_SET(sockSrv, &fdSocket);
}
}
}
这段代码,只能发送或者接收一次,请问是不是客户端每次发送或接收都要connect?如果这样,那会不会对服务端造成压力?
我服务端的代码有问题吗?
------解决方案--------------------
结贴把
SOCKET客户端可以connect一次,发送接收多次吗?下面代码已经WSAStartup()
客户端代码:
sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2200);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
start=true;
while(1)
{
char* recvBuf=new char[500];
ZeroMemory(recvBuf,500);
int recvcount=recv(sockClient,recvBuf,500,0);
if((strlen(recvBuf)>0)&&(recvcount!=0)&&(recvcount!=SOCKET_ERROR))
{
char* text=new char[GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text,GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500);
strcat(text,recvBuf);
Sleep(300);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text);
SetForegroundWindow(hWnd);
delete[] text;
text=NULL;
}
delete[] recvBuf;
recvBuf=NULL;
// closesocket(sockClient);
}
服务端代码:
HWND hWnd = AfxGetMainWnd()->m_hWnd;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup( wVersionRequested, &wsaData );
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2200);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//
start=true;
fd_set fdSocket; // 所有可用套节字集合
FD_ZERO(&fdSocket);
FD_SET(sockSrv, &fdSocket);
while(1)
{
fd_set fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
if(nRet>0)
{
if(FD_ISSET(sockSrv, &fdRead))
{
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
//::AfxMessageBox("已经ACCEPT!");
FD_SET(sockConn, &fdSocket);
}
else
{
char* recvBuf=new char[500];
ZeroMemory(recvBuf,500);
int recvcount=recv(sockConn,recvBuf,500,0);
if(recvcount>0)
{
char* text=new char[GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+500];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text,GetWindowTextLength(GetDlgItem(hWnd,IDC_EDIT1))+501);
strcat(text,recvBuf);
Sleep(300);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),text);
SetForegroundWindow(hWnd);
delete[] text;
text=NULL;
}
else
{
closesocket(sockConn);
FD_CLR(sockConn, &fdSocket);
FD_SET(sockSrv, &fdSocket);
}
}
}
这段代码,只能发送或者接收一次,请问是不是客户端每次发送或接收都要connect?如果这样,那会不会对服务端造成压力?
我服务端的代码有问题吗?
------解决方案--------------------
结贴把