注:程序是调式通过的,只是不知道这样写合不合逻辑。对不对,请高手指点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);
}

解决方案 »

  1.   

    有几点问题:
    1、m_sockServer、sClient没有delete;
    2、if (nLen == -1)应改为if (nLen < 0);
    3、TCP协议的Send和Receive不是一一对应的,一次发送的数据可能分多次收到,多次发送的数据也可能一次收到,需要自定义协议来处理,最简单的方式就是每次发送数据前先发送一个DWORD表示此次发送数据的长度,接收方先接收这个DWORD(注意要判断Receive函数的返回值,如果小于4要多次接收),然后再根据长度来接收,每次都要判断返回值。
      

  2.   

    更正一下,第2点,应改为if (nLen <= 0)。
      

  3.   

    接收方先接收这个DWORD(注意要判断Receive函数的返回值,如果小于4要多次接收)我想知道,这一个DWORD的4字节也有可能分多次收吗?那如何循环接收这一个DWORD呢?
      

  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);
      

  5.   

    即使是一个WORD也可能会分两次收到。
      

  6.   

    DWORD dataLength;
    int bufferLength = sizeof(dataLength);
    char* buffer = &DataLength;结果
    cannot convert from 'unsigned long *' to 'char *'能这么用吗?
      

  7.   

    char* buffer = (char*)&DataLength; 
      

  8.   

    可以接收了,,但是还有个问题,就是怎么判断正确性,,比如,我用telnet连接这个服务器,随便打了个数字,然后也收到了这个dword,但值是221261873我怎么办呢?
      

  9.   

    两端的程序都严格遵守协议,就是发送方每次先发一个DWORD表示数据长度,然后按长度发送数据,接收方先接收DWORD,然后按DWORD指示的长度接收后面的数据,不需要判断正确性。