1.实验目的

① 通过本实验加深对TCP协议传输数据过程的理解。

② 学习套接字的使用。

2.实验内容

以使用Visual C++程序设计语言,编写TCP传输数据的程序,在两台计算机上实现TCP数据传输为例,要求实现以下功能:

① 在一个工程中,创建一个对话框,包括“发送数据”和“接收数据”窗口。

② 一台计算机在发送数据窗口,输入目标计算机的IP地址和发送的对话内容,目标计算机在接收数据窗口能够显示对方发送的数据信息。

③ 编程实现两台计算机相互发送和接收数据信息。

3.实验步骤

① 启动Visual C++ 6.0,用MFC创建对话框。

② 选择“文件”→“新建”命令,在弹出的对话框中选择“MFC Appwizard[exe]”选项,工程名为“Chat”。

③ 在“您要创建的应用程序类型”对话框中,选择“基本对话框”单选按钮,完成默认窗口的建立,删除默认窗口中的“按钮”和“编辑框”。

④ 建立数据传输对话框。

l 选择控件中的“编辑框”控件,在对话框的上方和右下方分别建立“发送”和“接收”数据内容窗口。

l 选择“IP地址”控件,在对话框的下方左侧建立所要输入的目标地址窗口。

l

选择“按钮”控件,实现发送数据操作。

l 创建两个“组框”分别起名为“接收数据”和“发送数据”,以实现程序的可视效果。完成后的对话框如图6-9所示。

⑤ 为了编程方便,将接收“编辑框”和发送“编辑框”的ID改为IDC_EDIT_RECV和IDC_EDIT_SEND,按钮的属性改为IDC_BTN_SEND。

⑥ 参考程序

//调用套接字初始化函数

BOOL CChatDlg::OnInitDialog()

{

CDialog::OnInitDialog();

......

// TODO: Add extra initialization here在该句下添加以下内容

InitSocket();

RECVPARAM *pRecvParam=new RECVPARAM;

pRecvParam->sock=m_socket;

pRecvParam->hwnd=m_hWnd;

HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);

CloseHandle(hThread);

}

在接收数据时,如果没有数据到来,则recvfrom函数则会阻塞,从而导致程序暂停运行,所以将接收数据的工作放到单独的线程来完成。给线程传递两个参数,一个是创建的套接字,一个是对话框的句柄,即接收编辑框的句柄,当线程接收到数据之后,可以将数据传回给对话框中的编辑框,经过处理后显示。

//对套接字进行初始化 自定义函数

BOOL CChatDlg::InitSocket()

{

m_socket=socket(AF_INET,SOCK_DGRAM,0); //创建用于监听的套接字

if(INVALID_SOCKET==m_socket)

{

MessageBox("套接字创建失败");

return FALSE;

}

//绑定套接字

SOCKADDR_IN addrSock;

addrSock.sin_family=AF_INET; //地址族 AF_INET

addrSock.sin_port=htons(6000); //分配给套接字的端口

addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
// IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据

int retval;

retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
//将该套接字绑定到本地的某个地址和端口上

if(SOCKET_ERROR==retval)

{

closesocket(m_socket);

MessageBox("绑定失败");

return FALSE;

}

return TRUE;

}

//在CChatDlg头文件里增加以下内容

#define WM_RECVDATA WM_USER+1 //增加自定义WM_RECVDATA消息的定义

struct RECVPARAM //增加RECVPARAM结构体的定义

{

SOCKET sock;

HWND hwnd;

};

afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);
// 增加消息响应函数原型的声明

//接收数据,自定义线程函数,该函数一直在执行

DWORD WINAPI RecvProc(LPVOID lpParameter)

{

SOCKET sock=((RECVPARAM*)lpParameter)->sock;

HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;

SOCKADDR_IN addrFrom; //接收客户端的地址信息

int len=sizeof(SOCKADDR);

char recvBuf[200];

char tempBuf[300];

int retval;

while(TRUE)

{

retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);

if(SOCKET_ERROR==retval)

{

break;

}

printf(tempBuf,"%s 说:%s",inet_ntoa(addrFrom.sin_addr),recvBuf);

//将数据传给对话框

::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
//发送消息,只要一有消息,就发送RECVDATA消息,也就是调用函数OnRecvData()

}

return 0;

}

//把接收到的数据在编辑框IDC_EDIT_RECV里进行显示

void CChatDlg::OnRecvData(WPARAM wParam, LPARAM lParam)

{

CString str=(char *)lParam;

CString strTemp;

GetDlgItemText(IDC_EDIT_RECV,strTemp);
//在网络中接收到的内容存储到strTemp变量中,然后显示到接收窗口中

str+="rn";

str+=strTemp;

SetDlgItemText(IDC_EDIT_RECV,str);

}

// 发送数据,单击“发送”按钮的消息响应函数

void CChatDlg::OnBtnSend()

{

DWORD dwIP;

//首先得到控件指针

((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
//地址变量窗口

SOCKADDR_IN addrTo;

addrTo.sin_family=AF_INET;

addrTo.sin_port=htons(6000);

addrTo.sin_addr.S_un.S_addr=htonl(dwIP);

CString strSend;

GetDlgItemText(IDC_EDIT_SEND,strSend);//发送窗口的内容存储在变量strSend中

sendto(m_socket,strSend,strSend.GetLength()+1,0, (SOCKADDR*)&addrTo,sizeof(SOCKADDR));

SetDlgItemText(IDC_EDIT_SEND,"");

}

⑦ 以下为两台计算机的程序运行结果,设计算机1的IP地址为192.168.32.110,计算机2的IP地址为192.168.32.117。图6-10所示为计算机1给计算机2发送的消息,图6-11所示为计算机2给计算机1回应的消息,图6-12为计算机1收到的计算机2回应信息。

图6-10 计算机1发送消息窗口 图6-11 计算机2发送消息窗口

图6-12 计算机1收到的回应消息窗口

mfc三视图和斜等测图实现_编程实现TCP协议数据传输相关推荐

  1. mfc三视图和斜等测图实现_如何在UE4中实现NPR(非真实感)渲染效果?

    如何在UE4中实现NPR(非真实感)渲染效果?本文作者尝试在UE4中制作了秋叶原南出口的画面,并分享了全部的制作过程,希望对大家有所帮助. 在虚幻引擎中制作秋叶原南出口 我经常在artstation上 ...

  2. 数字测图原理与方法的实习日志_【技术】消费级无人机倾斜摄影测量1:500测图方法及精度研究...

    摘要:针对多镜头测绘级无人机价格昂贵.技术门槛较高的问题,本文提出利用消费级无人机获取的倾斜影像制作大比例尺地形图的方法.该方法运用消费级单镜头无人机,在RTK(real-timekinematic) ...

  3. 数字化测图是利用计算机自动绘制地形图,运用VirtuoZo软件实现航空摄影测量数字化测图...

    摘 要 本文简单介绍了航空摄影测量地形图成图的内业数据处理步骤,并结合VirtuoZo.NT版数字摄影测量软件进行了具体说明. Abstract:this text to in brief intro ...

  4. 1:2000比例尺测图

    房屋应逐个表示,临时性房屋可舍去:1:2000比例尺测图可适当综合取舍,图上宽度小于0.5mm的小巷可不表示.2.3建筑物和围墙轮廓凸凹在图上小于0.4mm,简单房屋小于0.6mm时,可用直线连接. ...

  5. 清华山维EPS三维测图无法进行OSGB格式转换问题(实测)

    EPS地理信息工作站由北京清华山维新技术开发有限公司历经十五年精心研发和打造,为满足"以地理信息服务为中心"的信息化测绘生产需求而推出的测绘生产活动多种业务模块集成化软件系统.集信 ...

  6. 淘宝客推广的优势 推广作用提高销量、转化率、测图测款

    今天个大家介绍一种推广方式淘宝客推广,推广方式越来越多,例如直通车.钻展. v兔等,淘宝客是钻展中的一种推广方式,但是在那么多推广方式下为什么淘宝客这种方式能存活下来,并且使用它的人还那么多.我们将从 ...

  7. 【EPS精品教程】EPS2016三维测图软件常用快捷键(建议收藏)

    EPS2016三维测图软件常用快捷键(建议收藏) 状 态 键盘位置 功能名称 功能描述 选择 Shift 拖点 按下鼠标左键移动光标,将目标点拖到其他位置 C 闭合 使打开的当前线闭合,闭合的当前线打 ...

  8. 跑模电脑配置、CC集群和空三技巧、三维测图...一整套航测内业实战教程

    " 前两天我们推出了张稳养老师的外业教程:无人机航测从外业作业到内业处理,我们有一整套实战教程!(精灵4RTK外业部分),大家对张老师的教程给出了一致的好评! 今天我们继续分享!这次分享的是 ...

  9. 大学计算机作业与实验报告东北农业大学,大学课程数字化测图实习报告.doc

    东北农业大学 实验报告 课程名称: 数字化测图技术 课 程 号: 实验学期:2014-2015学年第一学期 学 院: 资源与环境学院 班 级: 学 号: 实验项目一二三四得 分指导教师总 成 绩姓 名 ...

最新文章

  1. 线段树 ---- CF1004F Sonya and Bitwise OR(线段树上分治合并区间信息 + or 前缀和的log性质)
  2. P1339 热浪 最短路径模板题
  3. struts2 hibernate登录
  4. Postgres使用Copy命令将表导出成csv文件的遇到Permission Denied等错误
  5. 国产奶粉冲击高端,飞鹤、蒙牛、合生元们的牌好不好打?
  6. nginx反向代理和shiro权限校验产生的404问题
  7. 【数据结构与算法】二叉堆与二叉搜索树的区别
  8. 怎样正确查看Linux的内存占用情况
  9. 在VMWare上安装CentOS8
  10. (99)FPGA ROM实现(V实现)
  11. 窗口操作-关闭,最小化
  12. pandas (loc、iloc、ix)的区别
  13. Atitit.故障排除系列---php 程序网站数据库错误排除流程
  14. iconfont 阿里巴巴矢量图标库 在线引入图标
  15. 实验十、静态路由和直连路由引入配置
  16. 单细胞转录组测序建库方法小结
  17. 求一元二次方程的实根或虚根
  18. events插件的使用
  19. WebRTC中的信令和内网穿透技术 STUN / TURN
  20. sql中的日期和字符串的转化

热门文章

  1. Exchange server 2007启用 设置pop3
  2. 字符串首字母置为大写
  3. 问题六十六:怎么用ray tracing画CSG(Constructive Solid Geometry 构造实体几何)图形
  4. 物联网卡网速被限制如何解除
  5. Java 使用 POI 对 Excel文件 进行读写操作
  6. java集合框架介绍_Java集合框架全面介绍(一)
  7. java redis监听问题_springboot+redis过期事件监听实现过程解析
  8. 信息系统项目的应急预案方案_【学习】环评、验收、排污许可证、应急预案,都应在项目什么阶段开展?...
  9. 网络运维超融合服务器,15. 通过 Openfiler 软件:配置 ISCSI 和
  10. L2-001 紧急救援(最短路)