我编写的服务端只能接受一次客户端的请求,也就是客户端请求后发送数据我收到了,然后再次发送数据就收不到了,我用的是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;
}在线急等
{
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;
}在线急等
while(1)
{
accept();
recv();
}
这是你listen线程的结构,可不每次只能收一次么。
如果是长连接,可以accept成功后,创建socket接收线程;
如果是短连接,好歹你也close一下吧?另外,recv判定返回值了么?你的通信有协议么?你的程序调试了么?accept函数是阻塞的,你发现了么?
建议你把一些最基础的问题先搞清楚,再重新写这段代码。
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;
}