我同事写的一段SOCKET的服务端的程序,我用SOCKETTOOL工具进行测试的时候,连接和断开端口都是正常的,唯独在接受消息时出现问题, 服务端只能收到客户端第一次发过来的消息,之后所有的消息都收到不到,麻烦知道的朋友看看服务端的这个代码哪里出现的问题,万分感谢!创建SOCKET的部分代码:
BOOL CDemo1View::CreateIEC61850Socket()
{
//Win Sock Version Check
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if ( err !=  0)
{
return FALSE;
} if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return FALSE;
} //Create Socket
sockHandle = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockHandle)
{
WSACleanup();
return FALSE;
} //Bind Operation
sockaddr_in addrMe; 
addrMe.sin_family       =   AF_INET; 
addrMe.sin_port         =   htons(DEFAUL_IEC61850_CFG_PORT);
addrMe.sin_addr.s_addr  =   INADDR_ANY;   
bind(sockHandle, (struct sockaddr*)&addrMe, sizeof(addrMe));  //Create Thread for listening & handle
DWORD ThreadId;
m_hCapThread2 = ::CreateThread( NULL, 0, CaptureThread2, this, 0, &ThreadId );
if (m_hCapThread2 == NULL)
{
return FALSE;    
}
::SetThreadPriority( m_hCapThread2, THREAD_PRIORITY_NORMAL);  //THREAD_PRIORITY_NORMAL return TRUE;
}
对接受客户端的消息进行判断的部分代码:
DWORD WINAPI CDemo1View::CaptureThread2( LPVOID lpdate )
 {
 SOCKADDR_IN addrClient;
 int len = sizeof(SOCKADDR);
 CDemo1View* pthis = (CDemo1View*)lpdate;  //Start to Listen
 listen(pthis->sockHandle, 5);
 SOCKET sockConn = accept(pthis->sockHandle, (SOCKADDR*)&addrClient, &len);  for (;;)
 {
 //::WaitForSingleObject(pthis->m_hCapThread2, 1); 
char recvBuf[50];
for(;;)
{
::WaitForSingleObject(pthis->m_hCapThread2, 1);  memset(recvBuf, 0, 50);
recv(sockConn, recvBuf, 50, 0);//问题好像就出现这里,当客户端第一次发消息过来时,BUFFER里面有字节,后面再发的时候,BUFFER就一直是空的,郁闷啊,请朋友们指点一下!
if(strlen(recvBuf) > 0)
{
if(strcmp(recvBuf, "quit") == 0)
break;
{ if(strcmp("cap", recvBuf) == 0) //当客户端发送的消息为cap时即开始处理
{
CString strFileName;
CTime tNow;
tNow = CTime::GetCurrentTime();
CString sNow = tNow.Format("%Y%m%d%I%M%S");
strFileName.Format("%s\\TT_%s.bmp",strCapturePath, LPCSTR(sNow));
TT_SaveCurrImage(pthis->m_DeviceHandle,(char *)(LPCTSTR)(strFileName));
send(sockConn,strFileName.GetBuffer(strlen(strFileName)),strlen(strFileName),0);
}
}
}
}  
 } //End of for(;;)  return 0;
 }

解决方案 »

  1.   

    socket,socket,socket,回头一定要好好再学习一下!  郁闷死!
      

  2.   


    客户端我用的是sockettool工具进行测试的,确定客户端有数据发送过来。 服务端已经成功的接受到sockettool第一次发过来的数据,后面的数据就再也收不到了。 
      

  3.   

    具体原因不能看出
    WaitForSingleObject(pthis->m_hCapThread2, 1);
    如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
      

  4.   

    我没有看到调用listen函数,貌似bind完直接accept了。
      

  5.   

    sorry,看到listen函数了。继续看。
      

  6.   

    accept()要放到for(;;)循环体里面才能多次嘛
      

  7.   

    ::WaitForSingleObject(pthis->m_hCapThread2, 1); 这肯定不对。-------------            recv(sockConn, recvBuf, 50, 0);
                if(strlen(recvBuf) > 0)
                {这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。