新建接收数据线程

来源:互联网 发布:声音模拟的软件 编辑:程序博客网 时间:2024/06/05 06:12

//C++版

unsigned nThreadId;

    ////新起用来监听端口过来的连接请求线程

     HANDLE hThreadListenPort = (HANDLE)_beginthreadex( NULL, 0, &ListenPort, NULL, 0,&nThreadId );


//用来监听端口过来的连接请求
unsigned int _stdcall ListenPort(LPVOID lpThreadParameter)   
{   
    //初始化winsocket  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;  
    wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节  
    err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。  
    if ( err != 0 )  
    {  
        return 0;  
    }  
    if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容        
    {  
        WSACleanup( );  
        return 0;  
    }  
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP  
    SOCKADDR_IN addrSrv;   
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //htonl用来将主机字节顺序转换为网络字节顺序(to network long)  
    //INADDR_ANY就是指定地址为0.0.0.0的地址,  
    //表示不确定地址,或“任意地址”。”  
    addrSrv.sin_family=AF_INET;
    int int_port=8000;
    addrSrv.sin_port=htons(int_port);//htons用来将主机字节顺序转换为网络字节顺序(to network short)  
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket
    listen(sockSrv,5);//socket监听,准备接受连接请求。
    SOCKADDR_IN addrClient;  
    int len=sizeof(SOCKADDR);     
    while(1)  
    {          
        //接到连接请求
        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接  
        SOCKET* pSocket=new SOCKET();
        memcpy(pSocket,&sockConn,sizeof(SOCKET));
        unsigned int ThreadId;
        HANDLE hNewListenThread = (HANDLE)_beginthreadex( NULL, 0, &ReceiveDataFromClient,(void*)pSocket, 0,&ThreadId );
    }
}


unsigned __stdcall ReceiveDataFromClient(void *param)
{
    SOCKET* pSocket=(SOCKET*)param;
    SOCKET Socket=*pSocket;    
    char Buf[8000];
    while(true)
    {
        memset(Buf,0,sizeof(Buf));
        if (SOCKET_ERROR==recv(Socket,Buf,sizeof(Buf),0))
        {
            int Error=WSAGetLastError();
            int Index=(int)Socket;
            printf("端口%d 连接断开\n",Index);          
            return 0;
        }
        else
        {  
            string ReceiveRequest(Buf);
            if(ReceiveRequest!="")
            {
                printf("接收到的字符串是:%s\n",Buf);             
            }   
        }
    }
}


0 0
原创粉丝点击