Socket 学习之 MFC:简单通信

最终界面如图:

Socket 学习之 MFC:简单通信

代码如下:

原工程文件可以下载我上传的资源文件VS2013可以直接运行,其他版本清理生成文件后在运行,不懂得可以问。

附上链接:https://download.****.net/my

 

服务器端::

    //开启服务器按钮响应事件
    void CsFileDlg::OnBnClickedButton2()
    {
        // TODO: 在此添加控件通知处理程序代码
        WSADATA wsData;  
         WSAStartup(MAKEWORD(2,2), &wsData); 

         char name[80];
         CString IP;
         CString P;
         hostent* pHost; 
         gethostname(name,sizeof(name));//获得主机名 
         pHost = gethostbyname(name);//获得主机结构 
         IP = inet_ntoa(*(struct in_addr *)pHost->h_addr_list[0]);//获取主机ip地址
         showmsg_edit->SetWindowText("绑定IP地址:" + IP);
         AfxBeginThread(&server_thd,this); //开启新线程处理
    }

//发送消息按钮处理事件
  void CcFileDlg::OnBnClickedSend()
      {
         CString s;
         char * msg;
         send_edit->GetWindowText(s); 
         msg = (char*)s.GetBuffer(s.GetLength()); //获取发送的数据的缓冲区的指针
         if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) //判断发送是否成功
         {
              update("发送失败\r\n");
         }
         else if(s == "")   //判断发送的数据是否为空
         {
              MessageBox("请输入信息");
         }
         else
         {
              update("我:"+ s+"\r\n");//消息上屏
              send_edit->SetWindowText("");//清空输入
              send_edit->SetFocus(); //重获焦点
         }
    }

 

客户端::

  //链接,点连接按钮执行事件
    void CcFileDlg::OnBnClickedbtnconnect()
    {
        // TODO: 在此添加控件通知处理程序代码

        WSADATA wsaData;
        SOCKADDR_IN server_addr;


         WORD wVersion;
         wVersion = MAKEWORD(2,2);
         WSAStartup(wVersion,&wsaData);//使用Socket的程序在使用Socket之前必须调用WSAStartup函数。
         //该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;
         //操作系统利用第二个参数返回请求的Socket的版本信息。
        //当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,
        //然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
        //该函数执行成功后返回0

         CString ip;
         CString port;
         ip_edit->GetWindowText(ip);//取得服务器的IP地址
         port_edit->GetWindowText(port);//取得服务器的端口

         if(port=="") //判断端口是否为空
         {
             AfxMessageBox("请输入端口号");
             btnconn->EnableWindow(TRUE);
             return;
         }
         //为server_addr赋值 ,创建soket
         server_addr.sin_addr.s_addr = inet_addr((LPCSTR)ip);
         server_addr.sin_family = AF_INET;
         server_addr.sin_port = htons(atoi(port));

         if( (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) //判断soket是否创建成功
         {
              update("创建Soket错误!\r\n");
              btnconn->EnableWindow(TRUE);
              return;
         }
         if( connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)//判断链接是否成功
         {
              update("连接失败\r\n");
              btnconn->EnableWindow(TRUE);
              return;
         }
         else
         {
              update("连接成功\r\n");
              AfxBeginThread(&recv_thd, this); //开启线程处理
              btnconn->EnableWindow(FALSE);//连接按钮变灰
         }
    }

 

//发送消息按钮处理事件
  void CcFileDlg::OnBnClickedSend()
      {
         CString s;
         char * msg;
         send_edit->GetWindowText(s); 
         msg = (char*)s.GetBuffer(s.GetLength()); //获取发送的数据的缓冲区的指针
         if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR) //判断发送是否成功
         {
              update("发送失败\r\n");
         }
         else if(s == "")   //判断发送的数据是否为空
         {
              MessageBox("请输入信息");
         }
         else
         {
              update("我:"+ s+"\r\n");//消息上屏
              send_edit->SetWindowText("");//清空输入
              send_edit->SetFocus(); //重获焦点
         }
    }

 

原工程文件可以下载我上传的资源文件VS2013可以直接运行,其他版本清理生成文件后在运行,不懂得可以问。

附上链接:https://download.****.net/my