这一篇编程的心得文章, 我想把它作为我的程序, 现在我做了一个基于对话框的程序, 如何把这HandleConnect和我的对话框程序联起来? 注意到其中没有  WSAStartup(sockVersion, &wsaData); 和 WSACleanup();
另外 struRcvMsg * srmsg = ( struRcvMsg *)lpParam;
中的struRcvMsg 大概是个什么样的结构?谢谢!
UINT HandleLink(LPVOID lpParam)
{
SOCKET sClient = (SOCKET)lpParam;
CWinThread * hThread;
char szBuff[2048];
int iret;
char szmsg[200];
struRcvMsg * srmsg = ( struRcvMsg *)lpParam; int ims = 60000;
setsocketopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&ims, sizeof(ims) ); iret = recv(sClient, szBuff, 2048, 0 );
if ( iret == 0 )
{
sprintf(szmsg, "%s", "client closed!");
return -1;
}
else if ( iret == SOCKET_ERROR )
{
sprintf(szmsg, "recv() failded: "%d\n", WSAGetLastErroe());
return -1;
}
szBuff[iret] = '\0';
sprintf(szmsg, "Receive from client: %d bytes", iret);
DealWithMsg(szBuff);
closesocket(sClient);
}
DWORD WINAPI HandleConnect(LPVOID lpParam)
{
SOCKET sListen, sClient;
struct sockaddr_in local, client; CWinThread* hThread;
char szmsg[200];
char szbuff[2048]; sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if ( sListen ==  SOCKET_ERROR)
{
sprintf(szmsg, "socket() failed! Error: %d", WSAGetLastError());
return 1; }
if ( sListen == INVALID_SOCKET)
{
sprintf(szmsg, "Failed socket()");
WSACleanup();
//return SERVER_SOCKET_ERROR;
return 1;
} local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(8888); if ( bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
sprintf(szmsg, "socket() failed! Error: %d", WSAGetLastError());
return 1;
} listen(sListen, SOMAXCONN);
while(true)
{
int iAddrSize = sizeof(client);
sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize); if ( sClient == INVALID_SOCKET)
{
Sleep(10);
continue;
}
sprintf(szmsg, "Accepted client: %s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread = AfxBeginThread(HandleLink, sClient, THREAD_PRIORITY_NORMAL, 0, 0, NULL); if ( hThread == NULL )
{
Sleep(10);
continue;
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}

解决方案 »

  1.   

    1、这是一个服务段的程序,可以将HandleConnect作为一个线程来跑
    2、没有就加上,如果使用DIALOG向导时选择Socket就不用初始化了
    3、struRcvMsg = UINT 可以作为自定义消息的参数进行传递,我估计它的作用可能是这个。这里没看到使用情况,不好说。
      

  2.   

    线程是UINT HandleLink(LPVOID lpParam)还有一个更重要的是:DWORD WINAPI HandleConnect(LPVOID lpParam)
      

  3.   

    呵呵,这个就是最基本的socket阻塞+多线程的东西其实自己来写也很简单的呵呵,如果有什么不明白的地方可以联系我^_^
      

  4.   

    to: 小猪我想知道的是: DWORD WINAPI HandleConnect(LPVOID lpParam)
    是个什么样的函数?好象不是用MFC的, 于是我想知道, 如果用MFC写, 会该是什么样的?
      

  5.   

    这应该是用sdk写的WINAPI就是一种调用约定,大部分情况下相当于我们常见的 __stdcall用MFC写的话,这样就好罗^_^DOWRD CXXX::HandleConnect()