当Client连上server时, server发送数据, client能收到, client再发条数据给server时, server就收不到了,同时server发送也就会显示失败,导致client也就不能收到数据.这是什么原因?注: 如果server一直发送, client一直接没有问题, 或者是client一直发,server一直送也没有问题.以下是Server 的Code
//Server Accept
if(m_hSocketConn != INVALID_SOCKET)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
} m_hSocketConn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocketConn == INVALID_SOCKET)
{
return FALSE;
} SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//addrSrv.sin_addr.s_addr = inet_addr(IPADDR);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(m_nPort); if (bind(m_hSocketConn, (SOCKADDR*) &addrSrv, sizeof(addrSrv)) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
return FALSE;
} if (listen(m_hSocketConn, 5) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
return FALSE;
}
m_hAccept = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AcceptThread, this, 0, NULL);
m_bAccept = TRUE;
void CWIFIDevice::AcceptThread(LPVOID lParam)
{
CWIFIDevice *pWIFIDevice = (CWIFIDevice*)lParam;
SOCKADDR_IN addrClient;
int nLen = sizeof(SOCKADDR); while(pWIFIDevice->m_bAccept)
{
Sleep(10); if(pWIFIDevice->m_hSocketServer == INVALID_SOCKET)
{
pWIFIDevice->m_hSocketServer = accept(pWIFIDevice->m_hSocketConn, (SOCKADDR*)&addrClient, &nLen);
MessageBox(NULL, L"Accept", 0, 0);
}
}
}//Server Send
int CWIFIDevice::SendData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
return 0; int nSend = send(m_hSocketServer, pszData, nSize, 0); return nSend;
}//Server Recv
int CWIFIDevice::RecvData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
return 0; int nRecv = recv(m_hSocketServer, pszData, nSize, 0); return nRecv;
}
//Server Accept
if(m_hSocketConn != INVALID_SOCKET)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
} m_hSocketConn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocketConn == INVALID_SOCKET)
{
return FALSE;
} SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//addrSrv.sin_addr.s_addr = inet_addr(IPADDR);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(m_nPort); if (bind(m_hSocketConn, (SOCKADDR*) &addrSrv, sizeof(addrSrv)) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
return FALSE;
} if (listen(m_hSocketConn, 5) == SOCKET_ERROR)
{
closesocket(m_hSocketConn);
m_hSocketConn = INVALID_SOCKET;
return FALSE;
}
m_hAccept = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AcceptThread, this, 0, NULL);
m_bAccept = TRUE;
void CWIFIDevice::AcceptThread(LPVOID lParam)
{
CWIFIDevice *pWIFIDevice = (CWIFIDevice*)lParam;
SOCKADDR_IN addrClient;
int nLen = sizeof(SOCKADDR); while(pWIFIDevice->m_bAccept)
{
Sleep(10); if(pWIFIDevice->m_hSocketServer == INVALID_SOCKET)
{
pWIFIDevice->m_hSocketServer = accept(pWIFIDevice->m_hSocketConn, (SOCKADDR*)&addrClient, &nLen);
MessageBox(NULL, L"Accept", 0, 0);
}
}
}//Server Send
int CWIFIDevice::SendData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
return 0; int nSend = send(m_hSocketServer, pszData, nSize, 0); return nSend;
}//Server Recv
int CWIFIDevice::RecvData(char* pszData, int nSize)
{
if (m_hSocketServer == NULL)
return 0; int nRecv = recv(m_hSocketServer, pszData, nSize, 0); return nRecv;
}
解决方案 »
- vc怎么调用vb的dll啊?
- 关于 #pragma comment(lib 的问题
- vc如何读取文本为数据库表?(access或sqlserver)
- 十分疑惑,windows核心编程上面说:系统为每个进程维护着一张句柄表,可是我发现系统好像是为每个线程维护一张句柄表
- 高分求解JPEG2000的渐现问题
- BIN是什么格式的?用什么工具还原?
- 大菜虫的问题:到底该学delphi呢,还是vc++?
- 求代码翻译,谢谢大家!
- 如何在MFC中调用网页
- ((CWnd*)GetDlgItem(IDC_PRO))->ShowWindow(TRUE)中的ShowWindow(TRUE)什么意思啊?
- CBitmapButton怎样响应?
- 请教一个关于双缓冲绘图的问题?
{
if(m_hSocket != INVALID_SOCKET)
{
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
} m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
{
m_hSocket = NULL;
return FALSE;
} SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(m_szIPAddress);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(m_nPort);
connect(m_hSocket, (SOCKADDR *)&addrSrv, sizeof(addrSrv));
Sleep(3000);
//SendData("CONNECT", 7);
return TRUE;
}int CWIFIDevice::SendData(char *pszData, int nSize)
{
if (m_hSocket == NULL)
return 0; int nSend = send(m_hSocket, pszData, nSize, 0); return nSend;
}int CWIFIDevice::RecvData(char *pszData, int nSize)
{
if (m_hSocket == NULL)
return 0; return recv(m_hSocket, pszData, nSize, 0);
}
是server的recv, 还是client的recv存在问题
比如client发送的时候又调用了connect等
然后看看你server端发送失败的那个错误代码是什么?
连接被强制关闭了
你是不是调用了 closesocket 之类的?