《2023年通信原理实验报告2》由会员分享,可在线阅读,更多相关《2023年通信原理实验报告2(16页珍藏版)》请在金锄头文库上搜索。
1、学生学号 7实验课成绩学 生 实 验 报 告 书实验课程名称通信原理开 课 学 院计算机科学与技术学院指导教师姓名刘维学 生 姓 名陈鑫宇学生专业班级软件工程14012023-2023学年第2学期实验课程名称:_通信原理_ 实验项目名称采用Winsock在有线局域网上的点-点通信实验成绩实 验 者陈鑫宇专业班级软件1401组 别同 组 者叶旺实验日期 年 月 日一部分:实验预习报告(涉及实验目的、意义,实验基本原理与方法,重要仪器设备及耗材,实验方案与技术路线等)实验目的与规定1. “采用Winsock在有线局域网上的点-点通信”2. 熟悉VB6.0的控件和界面设计,进而熟悉Winsock的有
2、关控件及编程方法。3. 在了解所用的两个工作站和服务器的IP地址后,采用VB6.0的控件和Winsock控件编写并调试在有线局域网上的点-点通信程序。4. 具有点对点通信功能,任意客户端之间可以发送消息。编译语言与环境1.编程语言C/C+等均可;本次实验采用C+语言版本2.安装vs2023或更高版本的Windows系统pc机 网络编程是通过使用套接字来达成进程间通信目的的编程,Socket编程是网络编程的主流工具,Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。具体流程如上图所示。1、建立连接1) 服
3、务程序调用socket创建一个新的套接字,并在传输层实体中分派表空间,返回一个文献描述符用于以后调用中使用该套接字;调用bind将一个地址赋予该套接字,使得远程客户程序能访问该服务程序;调用listen分派数据空间,以便存储多个用户的连接建立请求;调用accept将服务程序阻塞起来,等待接受客户程序发来的连接请求。当传输层实体接受到建立连接的TPDU时,新创建一个和本来的套接字相同属性的套接字并返回其文献描述符。服务程序创建一个子进程解决本次连接,然后继续等待发往本来套接字的连接请求。2) 客户程序调用socket创建一个新的套接字,并在传输层实体中分派表空间,返回一个文献描述符用于在以后的调
4、用中使用该套接字;调用connect阻塞客户程序,传输层实体开始建立连接,当连接建立完毕时,取消阻塞;2、数据传输 双方使用send和receive完毕数据的全双工发送。3、释放连接 每一方使用close原语单独释放连接。关键代码示例:服务器端:/定义服务器端socketsockServer = socket(AF_INET, SOCK_STREAM,0);/设立服务器端socketaddrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/本机IPaddrServer.sin_family = AF_INET;addrServer.sin_por
5、t = htons(6000);/将服务器socket绑定在本地端口bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR);/Listen监听端口listen(sockServer, 10);/10为等待连接数目printf(服务器已启动:n监听中.n);len = sizeof(SOCKADDR);while (1)/accept会阻塞进程,直到有客户端连接上来为止sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);/当客户端连接上来时,拼接字符串sprint
6、f(sendBuf, 欢迎 ip:%s 的用户连接,这里是陈鑫宇的服务器,欢迎使用n, inet_ntoa(addrClient.sin_addr);/向客户端发送字符串send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);/获取客户端返回的数据recv(sockClient, recvBuf, 100, 0);/打印客户端返回的数据printf(%sn, recvBuf);/关闭socketclosesocket(sockClient);客户端:/ 新建服务器端scoketsockServer = socket(AF_INET, SOCK_STR
7、EAM, 0);/ 定义要连接的服务端地址addrServer.sin_addr.S_un.S_addr = inet_addr(10.139.14.180);/ 目的IP (100.64.175.119是本机地址)addrServer.sin_family = AF_INET; / 协议类型是INETaddrServer.sin_port = htons(6000);/ 连接端口1234/ 让 sockClient 连接到 服务端connect(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR);/ 从服务端获取数据recv(sockS
8、erver, recvBuf, 100, 0);/ 打印数据printf(服务器端输入:%sn, recvBuf);message = 大家好,我是叶旺;printf(向服务器发送:%sn,message);/ 发送数据到服务端send(sockServer, message, strlen(message) + 1, 0);/ 关闭socketclosesocket(sockServer);WSACleanup();第二部分:实验过程记录(可加页)(涉及实验原始数据记录,实验现象记录,实验过程发现的问题等)服务器ip地址为192.168.1.110客户端发送的信息成功传输到了服务器并显示了出
9、来,第三部分 结果与讨论(可加页)一、 实验结果分析(涉及数据解决、实验现象分析、影响因素讨论、综合分析和结论等)打开服务器程序,然后点击开始通信按钮,打开客户端程序在客户端输入数据,数据成功从客户端传输到了服务器端,并成功显示了出来,实验成功。二、小结、建议及体会 通过本次实验可以感受到网络在实际当中的运用,使我对网络编程有了更深的概念。同时让我发现自己知识结构的欠缺。虽然基本功能已经实现,但还是存在很多不稳定的问题尚待解决。 本次实验是对Socket的一个应用,让我更深的了解了Socket函数的作用及使用方法。实验过程中碰到了很多的问题,例如:程序只能通信一次。刚开始我认为建立的socke
10、t套接口只要建立一次并更新连接地址就可以多次使用。当初不知道问题存在的在于这,在程序加入很多错误报告代码,发现再客户端再次connect的时候返回负值。在网上查看很多相关代码之后,发现问题所在,把建立socket的代码写进客户端的循环体中,每次通信都重新建立socket套接口就可以了。 实验项目名称采用Winsock在无线局域网上的点-点群发通信实验成绩实 验 者陈鑫宇专业班级软件1401组 别同 组 者叶旺,杨彪实验日期 年 月 日一部分:实验预习报告(涉及实验目的、意义,实验基本原理与方法,重要仪器设备及耗材,实验方案与技术路线等)实验目的与规定1.“采用Winsock在无线局域网上的点-
11、点群发通信”2.修改实验01的界面设计,设计为多个接受地址的群发界面(由于群发是一对多的循环点-点通信),并修改相应的程序。3.在了解所用的3个工作站和服务器的IP地址后,采用VB6.0的控件和Winsock控件编写并调试在无线局域网上的点-点群发通信程序。编译语言与环境1.本次实验采用C+编程语言版本2.安装vs2023的Windows系统pc机问题分析点到群的通信就是客户端将消息发送至多个服务器端。相称于在客户端加入一个循环,依次给不同ip的服务器发送消息。在实验一的基础上,修改服务器端的消息响应方法可以实现点到群的通信。实验一中点到点的通信原理是,客户端将消息发送到服务器端,然后服务器端
12、反馈客户端相应的信息。在本实验中可以修改为客户端将消息发送至多个服务器端,然后接受传送回来的信息。相称于在客户端加入一个循环,依次给不同ip的服务端发送消息。关键代码示例:服务器端:/ server.cpp : 实现文献/#define _CRT_SECURE_NO_WARNINGS#include stdafx.h#include 通信实验.h#include server.h#include afxdialogex.h#include#include#pragma comment(lib,ws2_32.lib)static int num = 0;/ server 对话框IMPLEMENT
13、_DYNAMIC(server, CDialogEx)server:server(CWnd* pParent /*=NULL*/): CDialogEx(IDD_DIALOG1, pParent)server:server()void server:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(server, CDialogEx)ON_BN_CLICKED(IDC_BUTTON1, &server:OnBnClickedButton1)ON_WM_TIMER()END_MESSAGE_MAP()/ server 消息解决程序void server:OnBnClickedButton1()/ TODO: 在此添加控件告知解决程序代码/SetTimer(1, 50000, NULL);int err;/错误信息int len;char sendBuf100;/发送至客户端的字符串char recvBuf100;/接受客户端放回的字符串SOCKET sockServer;/服务器端SocketSOCKADDR_IN addrServer;/服务器端地址SOCKET sockClient;/客户端SocketSOCKADDR_IN addrClient;/