注:程序是调式通过的,只是不知道这样写合不合逻辑。对不对,请高手指点UINT ThreadRead(LPVOID lParam)
{
AfxSocketInit(); SOCKET sockClient = (SOCKET) lParam;
CSocket *c = new CSocket;
c->Attach(sockClient);
c->Send("WELCOME\r\n", 9); char buffer[1024];
int nLen; while ( 1 )
{
nLen = c->Receive(buffer, 1023);
if (nLen == -1)
{
c->Close();
delete c;
break;
} buffer[nLen] = '\0'; if (strcmp(buffer, "c") == 0)
{
nLen = c->Send("OK! BYE\r\n", 9);
c->Close();
delete c;
break;
} nLen = c->Send("OK!\r\n", 5); if (nLen == -1)
{
c->Close();
delete c;
break;
}
} return 0;
}UINT ThreadWaittingClient(LPVOID lParam)
{
AfxSocketInit(); SOCKET hServerSocket;
hServerSocket = (SOCKET) lParam;
CSocket s;
s.Attach(hServerSocket); CSocket *sClient = new CSocket;
while ( 1 )
{
s.Accept(*sClient); AfxBeginThread(ThreadRead, (LPVOID)sClient->Detach(),
THREAD_PRIORITY_NORMAL, NULL, NULL);
} return 1;
}void CCSQLAnyWhereServerDlg::OnStartService()
{
// TODO: Add your control notification handler code here
m_sockServer = new CSocket;
if (!m_sockServer->Create(8666))
return; if (!m_sockServer->Listen())
return; AfxBeginThread(ThreadWaittingClient, (LPVOID)(m_sockServer->Detach()),
THREAD_PRIORITY_NORMAL, NULL, NULL);
}
{
AfxSocketInit(); SOCKET sockClient = (SOCKET) lParam;
CSocket *c = new CSocket;
c->Attach(sockClient);
c->Send("WELCOME\r\n", 9); char buffer[1024];
int nLen; while ( 1 )
{
nLen = c->Receive(buffer, 1023);
if (nLen == -1)
{
c->Close();
delete c;
break;
} buffer[nLen] = '\0'; if (strcmp(buffer, "c") == 0)
{
nLen = c->Send("OK! BYE\r\n", 9);
c->Close();
delete c;
break;
} nLen = c->Send("OK!\r\n", 5); if (nLen == -1)
{
c->Close();
delete c;
break;
}
} return 0;
}UINT ThreadWaittingClient(LPVOID lParam)
{
AfxSocketInit(); SOCKET hServerSocket;
hServerSocket = (SOCKET) lParam;
CSocket s;
s.Attach(hServerSocket); CSocket *sClient = new CSocket;
while ( 1 )
{
s.Accept(*sClient); AfxBeginThread(ThreadRead, (LPVOID)sClient->Detach(),
THREAD_PRIORITY_NORMAL, NULL, NULL);
} return 1;
}void CCSQLAnyWhereServerDlg::OnStartService()
{
// TODO: Add your control notification handler code here
m_sockServer = new CSocket;
if (!m_sockServer->Create(8666))
return; if (!m_sockServer->Listen())
return; AfxBeginThread(ThreadWaittingClient, (LPVOID)(m_sockServer->Detach()),
THREAD_PRIORITY_NORMAL, NULL, NULL);
}
1、m_sockServer、sClient没有delete;
2、if (nLen == -1)应改为if (nLen < 0);
3、TCP协议的Send和Receive不是一一对应的,一次发送的数据可能分多次收到,多次发送的数据也可能一次收到,需要自定义协议来处理,最简单的方式就是每次发送数据前先发送一个DWORD表示此次发送数据的长度,接收方先接收这个DWORD(注意要判断Receive函数的返回值,如果小于4要多次接收),然后再根据长度来接收,每次都要判断返回值。
DWORD dataLength;
int bufferLength = sizeof(dataLength);
char* buffer = &DataLength;
do {
int ret = s.Receive(buffer, bufferLength);
if (ret <= 0)
{
// ……
}
buffer += ret;
bufferLength -= ret;
} while (bufferLength != 0);
int bufferLength = sizeof(dataLength);
char* buffer = &DataLength;结果
cannot convert from 'unsigned long *' to 'char *'能这么用吗?