zoukankan      html  css  js  c++  java
  • 多线程下MFC网络编程CSock类

    UINT ReceiverThreadProc(LPVOID pParam)//receive thread
    {
         if (!AfxSocketInit())  
          {  
             AfxMessageBox("应用程序没有调用    WSAStartup,或者        WSAStartup    失败");  
             return FALSE;   
          }
    CSocket RecSock;
    CSocket Connect;
         //sockaddr_in RecAddr;
         //memset(&RecAddr,0,sizeof(RecAddr));
         //RecAddr.sin_family=AF_INET;
         //RecAddr.sin_addr.s_addr=htonl(INADDR_ANY);
         //RecAddr.sin_addr.s_addr=inet_addr("127.0.0.1");;
         //RecAddr.sin_port =htons(PORT);
    /************得到本机IP地址***********/
         char m_SysName[50];
         char lpAddr[50];
         gethostname(m_SysName,sizeof(m_SysName));
         struct hostent * p_HostInfo=::gethostbyname(m_SysName);
         in_addr inAddr;
         memcpy(lpAddr,p_HostInfo->h_addr_list[0],strlen(lpAddr));
         memmove(&inAddr,lpAddr,4);
    /***********************************/
    if(!RecSock.Create(PORT,SOCK_STREAM,inet_ntoa(inAddr)))
    //create后,bind出错.需要bind的地址直接在create参数中指定.
    //if(!RecSock.Bind((SOCKADDR*)&RecAddr,sizeof(SOCKADDR)))
    if (!RecSock.Listen())
             while(true){
                 if(!RecSock.Accept(Connect))
                 {        
                     CString str;
                     str.Format("Accept error code:%d",RecSock.GetLastError());
                     AfxMessageBox(str);
                     return 0;
                 }
                 if (Connect.Receive(buffer,sizeof(buffer))<0)
                 {        
                     CString str;
                     str.Format("Receive error code:%d",RecSock.GetLastError());
                     AfxMessageBox(str);
                     Connect.Close();
                     continue;
                 }
                 //处理数据
                 Connect.Close();
            }
    }

    //发送线程
    UINT SenderThreadProc(LPVOID pParam)
    {
         if (!AfxSocketInit())  
         {  
             AfxMessageBox("应用程序没有调用    WSAStartup,或者        WSAStartup    失败");  
             return FALSE;   
         }
         char buf[BUFLEN];
         CSocket SendSock;
         sockaddr_in RecAddr;
         RecAddr.sin_family=AF_INET;
         RecAddr.sin_addr.s_addr=inet_addr(/*char * receiverip地址*/);
         RecAddr.sin_port =htons(PORT);
         SendSock.Create();
         if (!SendSock.Connect((SOCKADDR *)&RecAddr,sizeof(RecAddr)))
         {
             CString str;
             str.Format("Connect error code:%d",SendSock.GetLastError());
             AfxMessageBox(str);
             free(temp);
             return 0;
         }
         //往buf中添加数据
         SendSock.Send(buf,BUFLEN);
         SendSock.Close();
         return 1;
    }
    ps:线程函数要声明为static类型,或是全局的.如果在线程函数中要访问类中的成员,就将this指针传给pParam.
  • 相关阅读:
    Socket编程中的强制关闭与优雅关闭及相关socket选项
    怎样通过MSG_WAITALL设置阻塞时间,IO模式精细讲解: MSG_DONTWAIT 、 MSG_WAITALL
    RTSP、HTTP、HTTPS、SDP四种协议详解
    RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)
    Idea连接服务器docker并部署代码到docker实现一键启动
    @Autowired注解和静态方法
    关于工具类静态方法调用@Autowired注入的service类问题
    @PostConstruct
    spring-boot-starter-mail技术总结
    使用SpringBoot发送mail邮件
  • 原文地址:https://www.cnblogs.com/chuncn/p/1409266.html
Copyright © 2011-2022 走看看