创建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;
}
8 个解决方案
#1
socket,socket,socket,回头一定要好好再学习一下! 郁闷死!
#2
确定客户端有数据发送并到达服务器端了?
#3
客户端我用的是sockettool工具进行测试的,确定客户端有数据发送过来。 服务端已经成功的接受到sockettool第一次发过来的数据,后面的数据就再也收不到了。
#4
具体原因不能看出
WaitForSingleObject(pthis->m_hCapThread2, 1);
如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面
另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
WaitForSingleObject(pthis->m_hCapThread2, 1);
如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面
另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
#5
我没有看到调用listen函数,貌似bind完直接accept了。
#6
sorry,看到listen函数了。
继续看。。。。
继续看。。。。
#7
accept()要放到for(;;)循环体里面才能多次嘛
#8
::WaitForSingleObject(pthis->m_hCapThread2, 1);
这肯定不对。
-------------
recv(sockConn, recvBuf, 50, 0);
if(strlen(recvBuf) > 0)
{
这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。
这肯定不对。
-------------
recv(sockConn, recvBuf, 50, 0);
if(strlen(recvBuf) > 0)
{
这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。
#1
socket,socket,socket,回头一定要好好再学习一下! 郁闷死!
#2
确定客户端有数据发送并到达服务器端了?
#3
客户端我用的是sockettool工具进行测试的,确定客户端有数据发送过来。 服务端已经成功的接受到sockettool第一次发过来的数据,后面的数据就再也收不到了。
#4
具体原因不能看出
WaitForSingleObject(pthis->m_hCapThread2, 1);
如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面
另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
WaitForSingleObject(pthis->m_hCapThread2, 1);
如果是调试,是不方便的,你把后面的1时间改长点,断点放在接收大于0里面
另外,if(strlen(recvBuf) > 0),你是用strlen,你可以改为判断recv返回实际的接收值看实际有没接收数据
#5
我没有看到调用listen函数,貌似bind完直接accept了。
#6
sorry,看到listen函数了。
继续看。。。。
继续看。。。。
#7
accept()要放到for(;;)循环体里面才能多次嘛
#8
::WaitForSingleObject(pthis->m_hCapThread2, 1);
这肯定不对。
-------------
recv(sockConn, recvBuf, 50, 0);
if(strlen(recvBuf) > 0)
{
这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。
这肯定不对。
-------------
recv(sockConn, recvBuf, 50, 0);
if(strlen(recvBuf) > 0)
{
这也不对。不能用strlen判断收了多少字符,而是要得到recv函数的返回值。