以下是程序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)的话就无限阻塞接收不到了

解决方案 »

  1.   


    recv返回没有问题!
    再描述一遍我的问题吧,当服务器端接收第一遍字符时候没有问题,服务器返回OK,然后客户端每隔20秒发送一个空格我这边就阻塞在ACCEPT这块了,接收不到!
      

  2.   

    你的客户端程序是怎么写的?第一遍发送完成后的socket是closesocket之后20秒再次connect->send->closesocket?如果你只是等20秒再次send,服务器的accept肯定阻塞啊。
      

  3.   

    对于用一个客户端,不需要accept多次
      

  4.   

    感谢楼上两位作答,如果我不想关闭closesocket(sockConn);  那应该如何来写?
      

  5.   

    你的问题肯定是在客户端发送完第一次字符串后,调用了closesocket,这样的话,你再怎么发肯定是不行的了,肯定是阻塞在accept,因为没有新的客户端调用connect假设如果客户端中断了,重新连接,那么还想继续按原连接处理,那么可以把处理写成一个类,把得到的socket传进去处理,这时,你必需定一个协议,让服务器知道,这个新的连接需要按上一次旧的连接处理,也就是替换掉旧的连接
      

  6.   


    你这个应该不是好的思路,因为客户端新的连接后我只能通过 SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len); 来SEND或RECEIVE ,头痛如何解决呢?
      

  7.   

    2个线程,一个accept,一个recv
    多线程都是这么处理的
      

  8.   

    想了个折中的办法,用了setsockopt ,问题解决,结贴