新建两个基于对话框的工程,分别为sFile、cFile。在s端添加两个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Vertical scroll、Read-only三项),一个输入窗口IDC_EDIT2。然后增加一个发送按钮:IDC_BtnSend。在c端添加三个Edit:一个显示窗口IDC_EDIT1(点击右键选择Properties->Styles,选中Multiline,Vertical scroll、Read-only三项),一个输入窗口IDC_EDIT2,一个IP地址输入窗口IDC_EDIT3。再增加两个按钮:一个发送按钮IDC_SEND,一个连接服务器按钮IDC_btnConnect。

服务器端具体步骤如下:
1、在StdAfx.h中添加 #include <afxsock.h>  // MFC socket extensions
   在Resource.h中添加#define IDP_SOCKETS_INIT_FAILED         103
   在sFileDlg.h中添加public:void update(CString s);
   在sFileDlg.h中添加private:
                             CEdit* show_edit;
                      CEdit* send_edit;
2、在sFileDlg.cpp中添加#include <winsock2.h>(加在#include "stdafx.h"之前)
                       #pragma comment(lib, "WS2_32.lib")
   新建两个socket:SOCKET listen_sock;
                   SOCKET sock;
   声明线程函数  UINT server_thd(LPVOID p);
3、在OnInitDialog()函数中添加:
        show_edit = (CEdit *)GetDlgItem(IDC_EDIT1);
 send_edit = (CEdit *)GetDlgItem(IDC_EDIT2);
 send_edit->SetFocus();

char name[80];
 CString IP;
 hostent* pHost;
 gethostname(name, 128);//获得主机名
 pHost = gethostbyname(name);//获得主机结构
 IP = inet_ntoa(*(in_addr *)pHost->h_addr);
 update("本机IP地址:" + IP);
 AfxBeginThread(&server_thd, 0);
   添加函数update():
   void CSFileDlg::update(CString s)
{
 show_edit->ReplaceSel(s + "/r/n");
}
  添加线程函数server_thd():
   UINT server_thd(LPVOID p)
{
 WSADATA wsaData;

WORD wVersion;

wVersion = MAKEWORD(2,2);

WSAStartup(wVersion,&wsaData);

// WSAStartup(0x0202, &wsaData);
 SOCKADDR_IN local_addr;
 SOCKADDR_IN client_addr;
 int iaddrSize = sizeof(SOCKADDR_IN);
 int res;
 char msg[1024];
 CSFileDlg * dlg = (CSFileDlg *)AfxGetApp()->GetMainWnd();
 local_addr.sin_family = AF_INET;
 local_addr.sin_port = htons(5150);
 local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
 if( (listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
 {
  dlg->update("创建监听失败");
 }
 if( bind(listen_sock, (struct sockaddr*) &local_addr, sizeof(SOCKADDR_IN)) )
 {
  dlg->update("绑定错误");
 }
 listen(listen_sock, 1);
 if( (sock = accept(listen_sock, (struct sockaddr *)&client_addr, &iaddrSize)) == INVALID_SOCKET)
 {
  dlg->update("accept 失败");
 }
 else
 {
  CString port;
  port.Format("%d", int(ntohs(client_addr.sin_port)));
  dlg->update( "已连接来自:" + CString(inet_ntoa(client_addr.sin_addr)) + "  端口:" +
   port);
 }
 
 接收数据
 while(1)
 {
  if( (res = recv(sock, msg, 1024, 0)) == -1 )
  {
   dlg->update("失去连接");
   break;
  }
  else
  {
   msg[res] = '\0';
   dlg->update("client:" + CString(msg));
  }
 }
 return 0;
}
4、添加按钮实现函数void CSFileDlg::OnBtnSend():
   void CSFileDlg::OnBtnSend()
{
 // TODO: Add your control notification handler code here
 CString s;
 char * msg;
 send_edit->GetWindowText(s);
 msg = s.GetBuffer(s.GetLength());
 if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR)
 {
  show_edit->ReplaceSel("发送失败/r/n");
 }
 else if(s == "")
 {
  MessageBox("请输入信息");
 }
 else
 {
  show_edit->ReplaceSel("server:" + s + "/r/n");//消息上屏,清空输入,并重获焦点
  send_edit->SetWindowText("");
  send_edit->SetFocus();
 }
}
5、在InitInstance()函数中添加:
   if (!AfxSocketInit())
 {
  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
  return FALSE;
 }

客户端具体步骤如下:
1、在StdAfx.h中添加 #include <afxsock.h>  // MFC socket extensions
   在Resource.h中添加#define IDP_SOCKETS_INIT_FAILED         103
   在sFileDlg.h中添加public:void update(CString s);
   在sFileDlg.h中添加private:
                      CEdit* edit1;
                      CButton* btnconn;
                             CEdit* send_edit;
                      CEdit* ip_edit;
2、在sFileDlg.cpp中添加#include <winsock2.h>(加在#include "stdafx.h"之前)
                       #pragma comment(lib, "WS2_32.lib")
   新建一个socket:SOCKET sock;
   声明线程函数  UINT recv_thd(LPVOID p);
3、在OnInitDialog()函数中添加:
        edit1 = (CEdit *)GetDlgItem(IDC_EDIT1);
 send_edit = (CEdit *)GetDlgItem(IDC_EDIT2);
 btnconn = (CButton *)GetDlgItem(IDC_btnConnect);
 ip_edit = (CEdit *)GetDlgItem(IDC_EDIT3);

ip_edit->SetWindowText("127.0.0.1");

添加函数update():
   void CCFileDlg::update(CString s)
{
 edit1->ReplaceSel(s + "/r/n");
}
  添加线程函数recv_thd():
  UINT recv_thd(LPVOID p)
{
 int res;
 char msg[1024];
 CString s;
 CCFileDlg * dlg = (CCFileDlg *) AfxGetApp()->GetMainWnd();
 dlg->update("in thd");
 
 while(1)
 {
  if( (res = recv(sock, msg, 1024, 0)) == -1)
  {
   dlg->update("失去连接");
   break;
  }
  else
  {
   msg[res] = '/0';
   dlg->update("server:" + CString(msg));
  }
 }
 
 //closesocket(sock);
 return 0;
}
4、添加按钮实现函数void CCFileDlg::OnSend():
   void CCFileDlg::OnSend()
{
 // TODO: Add your control notification handler code here
 CString s;
 char * msg;
 send_edit->GetWindowText(s);
 msg = s.GetBuffer(s.GetLength());
 if(send(sock, msg, strlen(msg), 0) == SOCKET_ERROR)
 {
  update("发送失败");
 }
 else if(s == "")
 {
  MessageBox("请输入信息");
 }
 else
 {
  update("client:" + s);//消息上屏,清空输入,并重获焦点
  send_edit->SetWindowText("");
  send_edit->SetFocus();
 }
}
5、添加连接按钮实现函数OnConnect():
   void CCFileDlg::OnConnect()
{
 // TODO: Add your control notification handler code here
 WSADATA wsaData;
 SOCKADDR_IN server_addr;

WORD wVersion;

wVersion = MAKEWORD(2,2);

WSAStartup(wVersion,&wsaData);

// WSAStartup(0x0202, &wsaData);
 CString ip;
 ip_edit->GetWindowText(ip);//取得服务器的IP地址
 server_addr.sin_addr.s_addr = inet_addr(ip);
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(5150);
 if( (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
 {
  edit1->ReplaceSel("create socket error/r/n");
 }
 if( connect(sock, (struct sockaddr *) &server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
 {
  edit1->ReplaceSel("连接失败/r/n");
 }
 else
 {
  edit1->ReplaceSel("连接成功/r/n");
  AfxBeginThread(&recv_thd, 0);
  btnconn->EnableWindow(FALSE);//按钮变灰
 }
}
6、在InitInstance()函数中添加:
   if (!AfxSocketInit())
 {
  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
  return FALSE;
 }

MFC socket编程相关推荐

  1. 面试必备之:MFC socket编程(浅出+深度:服务端和客户端端口问题)

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  2. 基于MFC的socket编程(异步非阻塞通信)

    对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...

  3. MFC socket网络编程(流程示例)

    MFC socket网络编程(流程示例) 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 1.加 ...

  4. MFC:Socket编程—TCP服务端和多个客户端通信

    前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...

  5. 基于TCP(面向连接)的Socket编程

    基于TCP(面向连接)的Socket编程 一.客户端: 1.打开一个套接字(Socket); 2.发起连接请求(connect); 3.如果连接成功,则进行数据交换(read.write.send.r ...

  6. 揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...

  7. MFC 网络编程小结

    最近对MFC的网络编程方面研究了一下..现在想对学习过程中的问题和一些想法做下总结. 1.现说下socket(套接字)吧,初学者刚看到这个东西的时候一定觉得很神秘,我也一样,现在也只是有一点皮毛的理解 ...

  8. Socket编程知识必学/SELECT 编程

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  9. Windows Socket和Linux Socket编程的区别

    2019独角兽企业重金招聘Python工程师标准>>> 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2. ...

最新文章

  1. VS2017文件操作之使用fopen函数总结
  2. 量子计算101:浅谈其需求、前景和现实
  3. 丑数 Humble Numbers
  4. 转: 关于流量控制与令牌桶介绍
  5. Delphi格式化函数Format、FormatDateTime和FormatFloat详解
  6. 日期类型前后台传递格式控制注解@DateTimeFormat@JsonFormat@JSONField
  7. 关于python的多线程和多进程_Python的多线程和多进程
  8. 第12课:HA下的Spark集群工作机制解密
  9. Object类的用法(二)
  10. PyTorch 模型训练实用教程(附代码)
  11. jpa oracle 传参int类型判空_SQL查询:Oracle、mysql、HQL查询语句差异
  12. JavaScript 语言精粹 高清PDF中文版
  13. Java Map排序
  14. EPUB电子书阅读必备
  15. 今年的金德值得期待的人物_原水_新浪博客
  16. 《30天自制操作系统》学习笔记--第0天
  17. python爬取英雄联盟所有皮肤价格表_python 爬取英雄联盟皮肤并下载的示例
  18. syntax error:unterminated quoted string
  19. excel中以文本形式保存长数字
  20. Win10 Synaptics触摸板无法实现双指单击模拟鼠标右键点击的解决办法

热门文章

  1. 转 ajax.dll 与 ajaxpro.dll的用法
  2. Vue.js - Day4
  3. DiQuick Web UI 框架 V1.3.2 版本更新
  4. 基于 HTML5 WebGL 的 3D 机房
  5. Hirens Boot DVD 15.2 功能恢复版 v1.1 -- 制作U盘启动盘
  6. python读取数据库数据,读取出的中文乱码问题
  7. javascript中的cookie问题
  8. 一个我自己建的程序员资料分享站
  9. 【黑金动力社区】【BF531 体验板教程】 第二章 MS531介绍(二)
  10. 每日冲刺报告——Day2(Java-Team)