以下是程序while(1)
{
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET recv_socket=((RECVPARAM*)lpParameter)->sock_refer;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
//delete lpParameter;
SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len);//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
if(sockConn==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
//error=WSAGetLastError();
closesocket(sockConn);
return 0;
}
char recvBuf[1000];
memset(recvBuf,'\0',1000);
recv(sockConn,recvBuf,1000,0);
if(recvBuf[0]=='H'&&recvBuf[1]=='E'&&recvBuf[2]=='L'&&recvBuf[3]=='P')
{
char recvdataram[1000];
int i;
mode=1;
::PostMessage(hwnd,WM_RECVDATA,0,0);
remoteram[0]=0;
while(!remoteram[0])
Sleep(100);
send(sockConn,remoteram,100,0);//用返回的套接字和客户端进行通讯
memset(recvdataram,'\0',1000);
database[0]='\0';
for(i=0;i<6;i++)
{
int recvret=recv(sockConn,recvdataram,1000,0);
if(recvret==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
closesocket(sockConn);
return 0;
}
strcat(database,recvdataram);
database[(i+1)*1000]='\0';
} for(i=0;i<6000;i=i+2)
{
if(database[i]>'9')
database[i]=database[i]-0x37;
else
database[i]=database[i]-0x30;
if(database[i+1]>'9')
database[i+1]=database[i+1]-0x37;
else
database[i+1]=database[i+1]-0x30;
database[(i/2)]=database[i]*16+database[i+1];
}
closesocket(sockConn);
mode=3;
::PostMessage(hwnd,WM_RECVDATA,0,0);
mode=2;
::PostMessage(hwnd,WM_RECVDATA,0,0);
}
else
{ DWORD dwAddress=ntohl(addrClient.sin_addr.S_un.S_addr);
char OK[]="OK";
int Length_ok=strlen(OK);
int send_ok=send(sockConn,OK,Length_ok,0);//用返回的套接字和客户端进行通讯
if(send_ok==SOCKET_ERROR)
AfxMessageBox("发送过程中发生一个错误!",NULL,MB_OK);
// closesocket(sockConn);
mode=0;
::PostMessage(hwnd,WM_RECVDATA,(WPARAM)dwAddress,(LPARAM)recvBuf);
}
}当ACCEPT接收客户端其它字符串数据的话没有问题,但一旦客户端发送空格(ASCII 为20)的话就无限阻塞接收不到了
{
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET recv_socket=((RECVPARAM*)lpParameter)->sock_refer;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
//delete lpParameter;
SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len);//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
if(sockConn==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
//error=WSAGetLastError();
closesocket(sockConn);
return 0;
}
char recvBuf[1000];
memset(recvBuf,'\0',1000);
recv(sockConn,recvBuf,1000,0);
if(recvBuf[0]=='H'&&recvBuf[1]=='E'&&recvBuf[2]=='L'&&recvBuf[3]=='P')
{
char recvdataram[1000];
int i;
mode=1;
::PostMessage(hwnd,WM_RECVDATA,0,0);
remoteram[0]=0;
while(!remoteram[0])
Sleep(100);
send(sockConn,remoteram,100,0);//用返回的套接字和客户端进行通讯
memset(recvdataram,'\0',1000);
database[0]='\0';
for(i=0;i<6;i++)
{
int recvret=recv(sockConn,recvdataram,1000,0);
if(recvret==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
closesocket(sockConn);
return 0;
}
strcat(database,recvdataram);
database[(i+1)*1000]='\0';
} for(i=0;i<6000;i=i+2)
{
if(database[i]>'9')
database[i]=database[i]-0x37;
else
database[i]=database[i]-0x30;
if(database[i+1]>'9')
database[i+1]=database[i+1]-0x37;
else
database[i+1]=database[i+1]-0x30;
database[(i/2)]=database[i]*16+database[i+1];
}
closesocket(sockConn);
mode=3;
::PostMessage(hwnd,WM_RECVDATA,0,0);
mode=2;
::PostMessage(hwnd,WM_RECVDATA,0,0);
}
else
{ DWORD dwAddress=ntohl(addrClient.sin_addr.S_un.S_addr);
char OK[]="OK";
int Length_ok=strlen(OK);
int send_ok=send(sockConn,OK,Length_ok,0);//用返回的套接字和客户端进行通讯
if(send_ok==SOCKET_ERROR)
AfxMessageBox("发送过程中发生一个错误!",NULL,MB_OK);
// closesocket(sockConn);
mode=0;
::PostMessage(hwnd,WM_RECVDATA,(WPARAM)dwAddress,(LPARAM)recvBuf);
}
}当ACCEPT接收客户端其它字符串数据的话没有问题,但一旦客户端发送空格(ASCII 为20)的话就无限阻塞接收不到了
recv返回没有问题!
再描述一遍我的问题吧,当服务器端接收第一遍字符时候没有问题,服务器返回OK,然后客户端每隔20秒发送一个空格我这边就阻塞在ACCEPT这块了,接收不到!
你这个应该不是好的思路,因为客户端新的连接后我只能通过 SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len); 来SEND或RECEIVE ,头痛如何解决呢?
多线程都是这么处理的