我同事写的一段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;
}
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;
}
解决方案 »
- 将字符串转化为科学计数法的数字
- 注册ocx成功,但是放在网页上却显示不出来(急哦
- 哪里有VC6或者更高版本的下载
- 怎样运行时改变静态文本框的caption?我无法给它关联一个成员变量啊!
- 一个连接错误的问题,很邪门?
- vs2010里面创建单文档应用程序时BOOL CXXXApp::InitInstance()怎么和以前的不一样了啊
- 如何看反汇编VC做的EXE文件?
- (初学者提问)vc中bmp图像数组的显示方法
- 在另一个对话框中SetRecordSource视图中的ADO控件出错!!
- vc 有没有直接操作com口的函数?比如dos c 中的outportb 我不想用mscomm 控件
- 关于实时视频帧捕获
- fopen rb 读取文件中有0x0d ,0x0a的时候会出问题
客户端我用的是sockettool工具进行测试的,确定客户端有数据发送过来。 服务端已经成功的接受到sockettool第一次发过来的数据,后面的数据就再也收不到了。
WaitForSingleObject(pthis->m_hCapThread2, 1);
如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
if(strlen(recvBuf) > 0)
{这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。