我编写的服务端只能接受一次客户端的请求,也就是客户端请求后发送数据我收到了,然后再次发送数据就收不到了,我用的是TCP协议,代码如下:DWORD WINAPI CSandBoxieDlg::Listen_Hardware_Message(LPVOID lpParameter)
{
SOCKET sock = ((RECVPARAM *)lpParameter)->sock;
HWND hwnd   = ((RECVPARAM *)lpParameter)->hwnd; SOCKADDR_IN addrFrom;
char        recvBuf[200];
int         len = sizeof(SOCKADDR);

while(true)
{
SOCKET sockConnect = accept(sock,(SOCKADDR *)&addrFrom,&len);

if (SOCKET_ERROR == sockConnect)
{
AfxMessageBox(_T("测试"), MB_ICONERROR);
break;
}
else
{
recv(sockConnect,recvBuf,200,0);
::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)recvBuf);
}
}
return 0;
}在线急等

解决方案 »

  1.   

    你找个例子学习一下吧,按套路来处理问题。切莫别出心裁。
    while(1)
    {
        accept();
        recv();
    }
    这是你listen线程的结构,可不每次只能收一次么。
    如果是长连接,可以accept成功后,创建socket接收线程;
    如果是短连接,好歹你也close一下吧?另外,recv判定返回值了么?你的通信有协议么?你的程序调试了么?accept函数是阻塞的,你发现了么?
    建议你把一些最基础的问题先搞清楚,再重新写这段代码。
      

  2.   

    一次只服务一个请求
    DWORD WINAPI CSandBoxieDlg::Listen_Hardware_Message(LPVOID lpParameter)
    {
    SOCKET sock = ((RECVPARAM *)lpParameter)->sock;
    HWND hwnd   = ((RECVPARAM *)lpParameter)->hwnd; SOCKADDR_IN addrFrom;
    char        recvBuf[200];
    int         len = sizeof(SOCKADDR);

    SOCKET sockConnect = INVALID_SOCKET;

    while(true)
    {
    if (INVALID_SOCKET == sockConnect)
    {
    sockConnect = accept(sock,(SOCKADDR *)&addrFrom,&len);
    }
    else
    {
    int nLen = recv(sockConnect,recvBuf,200,0);
    if ( nLen <= 0) {
    closesocket(sockConnect);
    sockConnect = INVALID_SOCKET;
    }
    else {
    //nLen最好用wparam参数传递过去
    ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)recvBuf);
    }
    }
    }
    return 0;
    }