[原]VC SOCKET实现多线程并发连接

来源:互联网 发布:矢量网络分析仪端口 编辑:程序博客网 时间:2024/05/21 21:02

        最近想弄一个可以实现多线程并发连接的程序,用VC实现,可是网上没有现成的多线程并发源码,我只好自己做一个。我开始一直不知道怎么弄,后来在看一个帖子的时候,有一句话提醒了我:“Accept函数会返回一个新的SOCKET连接。”(大意是这样哈)。

        说到这你可能已经会了。灵感就在一瞬间啊!我以前怎么没有注意到呢?

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
DWORD _stdcall Thread_1 ( LPVOID lpParameter )
{
SOCKET Conn = (SOCKET)lpParameter;
while(1)
{
send(Conn,"Hello!\n",8,0);
Sleep(1000);
}
closesocket(Conn);
return 0;
}
int main()
{
    WSADATA wsaData;
    WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(80); //我用的是80端口,大家最好不要用
 
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

    listen(sockSrv,5);

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    while(1)
    {
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
CreateThread(NULL,0,Thread_1,(LPVOID)sockConn,0,NULL); //将新的SOCKET传给线程
}

return 0;
}

      搞定!用telnet测试一下!

[原]VC SOCKET实现多线程并发连接 - sunnysab - 奋斗

 
注:再将这些代码扩展之后,使用telnet连接,在异常断开SOCKET连接时可能会导致程序自动关闭,不知道怎么回事。
2013/7/3:
解决方案:
把main()中的SOCKET定义修改一下:
        SOCKET  Socket;
Socket = WSASocket( AF_INET, SOCK_STREAM, 0, 0, 0, WSA_FLAG_OVERLAPPED);
不知道是不是操作系统的问题,重装了操作系统并用这个代码后没出现过这种情况。