计算机网络原理实验三winsock套接字编程实验报告

合集下载

网络编程实验报告

网络编程实验报告

网络编程实验报告实验一TCP Socket API程序设计一、预备知识1.网络编程基本概念网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。

在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。

套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。

图1-1 TCP通信流程2.TCP通信流程TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。

二、实验目的1.了解Winsock API编程原理;2.掌握TCP Socket程序的编写;3.了解C/S模式的特点;4.学会解决实验中遇到的问题。

三、实验任务使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。

四、实验环境及工具1. Windows2000/XP/72. Visual C++开发平台3. Visual Studio2010五、实验内容和步骤参照《Visual C++网络编程教程》书中81页,TCP Socket API 程序设计。

连接:void CChatClientDlg::OnConnect(){WSADATA wsd; //WSADATA结构WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版m_client = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字//服务器地址sockaddr_in serveraddr;UpdateData();if(ServerIP.IsBlank()){AfxMessageBox("请指定服务器IP!");return;}if(sPort.IsEmpty()){AfxMessageBox("请指定端口!");return;}//获取服务器进程的IP和端口BYTE nFild[4];CString sIP;ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);//设置服务器地址结构的内容serveraddr.sin_family = AF_INET;serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);serveraddr.sin_port = htons(atoi(sPort));//发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) ! = 0){MessageBox("连接失败");return;}else{m_ListWords.AddString("连接服务器成功!");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLO SE); //①//界面完善ServerIP.EnableWindow(false);ServerPort.EnableWindow(false);m_ButtonConnect.EnableWindow(false);m_ButtonDisconnect.EnableWindow();m_EditWords.EnableWindow();m_ButtonSend.EnableWindow();m_ButtonExit.EnableWindow(false);m_ButtonClear.EnableWindow();}“断开”按钮的事件过程代码如下:void CChatClientDlg::OnDisconnect(){//断开与服务器的连接closesocket(m_client);m_ListWords.AddString("从服务器断开");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);ServerIP.EnableWindow();ServerPort.EnableWindow();m_ButtonConnect.EnableWindow();m_ButtonDisconnect.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);m_ButtonExit.EnableWindow();}“发送”按钮事件过程代码如下:void CChatClientDlg::OnSend(){//向服务器发送信息UpdateData();if(m_sWords.IsEmpty()){AfxMessageBox("发送的消息不能为空!");return;}//开始发送数据int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);m_ListWords.AddString("发送:" + m_sWords);m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}BOOL CChatClientDlg::PreTranslateMessage(MSG* pMsg){if(pMsg->message == 10000) //识别应用程序中定义的消息号{switch(pMsg->lParam) //判断网络事件类型{case FD_READ:this->ReceiveData(); //若为FD_READ则接收数据break;case FD_CLOSE:this->CloseSock(); //如果服务端断开,客户端也断开break;}}elsereturn CDialog::PreTranslateMessage(pMsg);}下面来实现ReceiveData()和CloseSock()方法。

网络编程期末实验报告

网络编程期末实验报告

一、实验目的1. 熟练掌握网络编程的基本原理和常用技术。

2. 掌握TCP/IP协议族中的TCP和UDP协议的使用方法。

3. 学会使用套接字编程实现网络通信。

4. 培养团队协作和问题解决能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 网络编程库:Winsock三、实验内容本次实验分为三个部分,分别为:1. TCP客户端/服务器模型2. UDP客户端/服务器模型3. 文件传输四、实验步骤及代码实现1. TCP客户端/服务器模型(1)服务器端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET serverSocket, clientSocket;struct sockaddr_in serverAddr, clientAddr;int addrLen = sizeof(clientAddr);char buffer[1024];// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError());return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(PORT);// 绑定套接字if (bind(serverSocket, (struct sockaddr)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {printf("绑定失败:%d\n", WSAGetLastError());closesocket(serverSocket);WSACleanup();return 1;}// 监听套接字listen(serverSocket, 5);// 接受客户端连接clientSocket = accept(serverSocket, (struct sockaddr)&clientAddr, &addrLen);if (clientSocket == INVALID_SOCKET) {printf("接受失败:%d\n", WSAGetLastError());closesocket(serverSocket);WSACleanup();return 1;}// 接收客户端数据while (1) {memset(buffer, 0, sizeof(buffer));int recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);if (recvLen > 0) {printf("接收到的数据:%s\n", buffer);} else if (recvLen == 0) {printf("客户端已断开连接\n");break;} else {printf("接收失败:%d\n", WSAGetLastError());break;}}// 关闭套接字closesocket(clientSocket);closesocket(serverSocket);WSACleanup();return 0;}```(2)客户端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET clientSocket;struct sockaddr_in serverAddr;char buffer[1024];// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字clientSocket = socket(AF_INET, SOCK_STREAM, 0);if (clientSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError());return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(PORT);// 连接服务器if (connect(clientSocket, (struct sockaddr)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {printf("连接失败:%d\n", WSAGetLastError());closesocket(clientSocket);WSACleanup();return 1;}// 发送数据char data = "Hello, server!";send(clientSocket, data, strlen(data), 0);// 关闭套接字closesocket(clientSocket);WSACleanup();return 0;}```2. UDP客户端/服务器模型(1)服务器端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET serverSocket;struct sockaddr_in serverAddr, clientAddr;int addrLen = sizeof(clientAddr);char buffer[1024];// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字serverSocket = socket(AF_INET, SOCK_DGRAM, 0);if (serverSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError()); return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(PORT);// 绑定套接字if (bind(serverSocket, (struct sockaddr)&serverAddr,sizeof(serverAddr)) == SOCKET_ERROR) {printf("绑定失败:%d\n", WSAGetLastError());closesocket(serverSocket);WSACleanup();return 1;}// 接收客户端数据while (1) {memset(buffer, 0, sizeof(buffer));int recvLen = recvfrom(serverSocket, buffer, sizeof(buffer), 0, (struct sockaddr)&clientAddr, &addrLen);if (recvLen > 0) {printf("接收到的数据:%s\n", buffer);} else {printf("接收失败:%d\n", WSAGetLastError());break;}}// 关闭套接字closesocket(serverSocket);WSACleanup();return 0;}```(2)客户端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET clientSocket;struct sockaddr_in serverAddr;char buffer[1024];// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字clientSocket = socket(AF_INET, SOCK_DGRAM, 0);if (clientSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError()); return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(PORT);// 发送数据char data = "Hello, server!";sendto(clientSocket, data, strlen(data), 0, (struct sockaddr)&serverAddr, sizeof(serverAddr));// 关闭套接字closesocket(clientSocket);WSACleanup();return 0;}```3. 文件传输(1)服务器端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET serverSocket, clientSocket;struct sockaddr_in serverAddr, clientAddr;int addrLen = sizeof(clientAddr);char buffer[1024];// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError());return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(PORT);// 绑定套接字if (bind(serverSocket, (struct sockaddr)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {printf("绑定失败:%d\n", WSAGetLastError());closesocket(serverSocket);WSACleanup();return 1;}// 监听套接字listen(serverSocket, 5);// 接受客户端连接clientSocket = accept(serverSocket, (struct sockaddr)&clientAddr, &addrLen);if (clientSocket == INVALID_SOCKET) {printf("接受失败:%d\n", WSAGetLastError());closesocket(serverSocket);WSACleanup();return 1;}// 接收文件名memset(buffer, 0, sizeof(buffer));int recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);if (recvLen > 0) {char filename = buffer;FILE fp = fopen(filename, "wb");if (fp == NULL) {printf("文件打开失败:%s\n", filename);closesocket(clientSocket);closesocket(serverSocket);WSACleanup();return 1;}// 读取文件内容并发送到客户端while (1) {memset(buffer, 0, sizeof(buffer));recvLen = recv(clientSocket, buffer, sizeof(buffer), 0); if (recvLen > 0) {fwrite(buffer, 1, recvLen, fp);} else if (recvLen == 0) {printf("客户端已断开连接\n");break;} else {printf("接收失败:%d\n", WSAGetLastError());break;}}// 关闭文件和套接字fclose(fp);closesocket(clientSocket);closesocket(serverSocket);WSACleanup();}return 0;}```(2)客户端代码:```c#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")#define PORT 8080int main() {WSADATA wsaData;SOCKET clientSocket;struct sockaddr_in serverAddr;char buffer[1024];char filename = "example.txt";// 初始化WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// 创建套接字clientSocket = socket(AF_INET, SOCK_STREAM, 0);if (clientSocket == INVALID_SOCKET) {printf("Socket创建失败:%d\n", WSAGetLastError()); return 1;}// 设置服务器地址memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(PORT);// 连接服务器if (connect(clientSocket, (struct sockaddr)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {printf("连接失败:%d\n", WSAGetLastError());closesocket(clientSocket);WSACleanup();return 1;}// 发送文件名send(clientSocket, filename, strlen(filename), 0);// 打开文件FILE fp = fopen(filename, "rb");if (fp == NULL) {printf("文件打开失败:%s\n", filename);closesocket(clientSocket);WSACleanup();return 1;}// 读取文件内容并发送到服务器while (1) {memset(buffer, 0, sizeof(buffer));int readLen = fread(buffer, 1, sizeof(buffer), fp);if (readLen > 0) {send(clientSocket, buffer, readLen, 0);} else if (readLen == 0) {printf("文件读取完毕\n");break;} else {printf("文件读取失败:%d\n", WSAGetLastError());break;}}// 关闭文件和套接字fclose(fp);closesocket(clientSocket);WSACleanup();return 0;}```五、实验总结本次实验通过编写TCP和UDP客户端/服务器模型,以及文件传输程序,掌握了网络编程的基本原理和常用技术。

计算机网络实验报告 winsock编程

计算机网络实验报告 winsock编程

计算机网络实验一:socket文件传输一、实验目地1、了解网络通信原理。

掌握客户端/服务器程序设计。

2、理解Socket通信原理,掌握使用ServerSocket类和Socket类进行TCPSocket通信的程序设计方法二、实验原理Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。

此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。

计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。

详细如图:我们来分析一下图,Host A上的程序A将一段信息写入Socket中,Socket 的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B 的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。

Socket套接口有3种类型。

1.SOCK_STREAM流式套接口,面向连接的,可靠地,TCP。

2.SOCK_DRAM数据报套接口,面向无连接,不可靠,UDP。

3.原始套接口,主要用于新的网络协议实现的测试三、实验分析1、实验要求、按需求编写服务器端和客户端程序代码。

实现:(1)服务器端向客户端提供文件目录。

(2)客户端向服务器端发出请求下载文件。

(3)客户端向服务器端上传文件。

2、Socket通信工作过程如下(1)、建立连接服务器(ServerSocket)监听指定端口,看是否有客户端的连接请求;客户端(ClientServer)创建套接字并通过指定端口请求与服务器建立连接。

winsock编程实验报告

winsock编程实验报告

winsock编程实验报告Winsock编程实验报告引言:Winsock(Windows Socket)是一种用于网络通信的编程接口,常用于开发基于TCP/IP协议的应用程序。

本篇文章将介绍我对Winsock编程的实验经历和心得体会。

实验目的:通过Winsock编程实验,深入了解网络通信原理和技术,掌握基于TCP/IP协议的应用程序开发方法。

实验环境:本次实验在Windows操作系统下进行,使用了Visual Studio 2019作为开发工具。

实验过程:1. 实验一:建立基于TCP的客户端/服务器通信在这个实验中,我首先创建了一个服务器程序和一个客户端程序。

服务器程序使用Winsock库函数创建了一个套接字,并绑定到指定的IP地址和端口上。

客户端程序通过Winsock库函数创建了一个套接字,并连接到服务器的IP地址和端口上。

通过这个实验,我学会了如何建立基于TCP的客户端/服务器通信。

2. 实验二:实现基于UDP的数据传输在这个实验中,我创建了一个基于UDP的数据传输程序。

UDP是一种无连接的传输协议,相对于TCP来说,它更加轻量级,适用于一些对数据可靠性要求不高的应用场景。

通过这个实验,我学会了如何使用Winsock库函数实现基于UDP的数据传输。

3. 实验三:实现多线程服务器在这个实验中,我将服务器程序改为多线程模式。

通过创建多个线程,服务器可以同时处理多个客户端的请求,提高了系统的并发性能。

这个实验让我更加深入地理解了多线程编程和网络通信的结合。

实验结果与分析:通过以上实验,我成功地实现了基于TCP和UDP的网络通信,并且在实验三中实现了多线程服务器。

在实验过程中,我遇到了一些问题,比如套接字的创建和绑定、连接的建立和断开等。

但通过查阅文档和调试,我最终解决了这些问题。

实验结果表明,Winsock编程是一种强大且灵活的工具,可以满足各种网络通信需求。

实验心得:通过本次实验,我对Winsock编程有了更深入的了解。

计算机网络原理实验三winsock套接字编程实验报告.云大软件学院doc

计算机网络原理实验三winsock套接字编程实验报告.云大软件学院doc

实验三、WINSOCK套接字编程实验报告序号: 10 姓名:学号:成绩指导老师:1.实验目的:用C或JA V A语言编写客户端、服务器程序,实现基于TCP或UDP的网络通信数据传输服务,熟悉基于TCP或UDP的Socket编程原理。

2.实验环境:建立在TCP/IP 网络体系结构之上计算机网络实验环境。

各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。

计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。

3.实验指导:参见套接字编程实验指导4.实验步骤(1)运行指导书中给出的参考程序,分析实验结果,并回答问题(1)-(3)(2)根据给定参考程序修改代码,完善修改服务器和客户端的功能。

并回答问题(4)-(5)5.实验结果分析(1)为什么在服务器和客户端要包含winsock2.h文件?答:这是系统自定义的“宏”,其中还包含了许多自定义的类型,如果不包含该文件,程序中会有许多类型无法识别。

(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?答:这句话的意思是链接“ws2_32.lib”这个库,如果不加就链接不到这个库。

(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用程序会有什么问题?答:为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要使用WSAStartup函数。

如果不用,程序将无法调用Socket库中的其他函数。

(4)修改后的程序完成实现了什么功能,附上修改后的源代码。

(修改或填加的代码用波浪线标注,并填加注释),并附上实验截图#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include<conio.h>#include<winsock2.h>#include<windows.h>#pragma comment(lib,"ws2_32.lib")#define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/#define SERVER_IP_ADDR "113.55.16.10" /*服务器的IP地址*/int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";int rval= 0, len= 0, err = 0;WORD wVersionRequested;WSADATA wsaData;/*指定socket版本,否则创建socket失败,即使创建socket返回值不为-1,但是bind 时会失败*/wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;/* 建立套接字*/sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){perror("opening stream socket");exit(1);}/* 使用任意端口命名套接字*/server.sin_family = AF_INET;server.sin_port = htons(MYPORT);server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR);memset(server.sin_zero, 0, sizeof(server.sin_zero));//将服务器地址与socket绑定在一起rval = bind(sock, (struct sockaddr *)&server, sizeof(server));if (rval < 0){perror("binding stream socket");exit(1);}// 找出指定的端口号并打印出来length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) < 0){perror("getting socket name");exit(1);}printf("socket port #%d\n", ntohs(server.sin_port));// 开始接收连接,最大请求数为listen(sock, 5);len = sizeof(struct sockaddr);do{ msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);if (msgsock == -1)perror("accept");else{ memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("-->%s\n", buf);}closesocket(msgsock);} while (TRUE);/* 因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。

计算机网络实验报告实验3

计算机网络实验报告实验3

计算机网络实验报告实验3一、实验目的本次计算机网络实验 3 的主要目的是深入理解和掌握计算机网络中的相关技术和概念,通过实际操作和观察,增强对网络通信原理、协议分析以及网络配置的实际应用能力。

二、实验环境本次实验在计算机网络实验室进行,使用的设备包括计算机、网络交换机、路由器等。

操作系统为 Windows 10,实验中使用的软件工具包括 Wireshark 网络协议分析工具、Cisco Packet Tracer 网络模拟软件等。

三、实验内容与步骤(一)网络拓扑结构的搭建使用 Cisco Packet Tracer 软件,构建一个包含多个子网的复杂网络拓扑结构。

在这个拓扑结构中,包括了不同类型的网络设备,如交换机、路由器等,并配置了相应的 IP 地址和子网掩码。

(二)网络协议分析启动 Wireshark 工具,捕获网络中的数据包。

通过对捕获到的数据包进行分析,了解常见的网络协议,如 TCP、IP、UDP 等的格式和工作原理。

观察数据包中的源地址、目的地址、协议类型、端口号等关键信息,并分析它们在网络通信中的作用。

(三)网络配置与管理在实际的网络环境中,对计算机的网络参数进行配置,包括 IP 地址、子网掩码、网关、DNS 服务器等。

通过命令行工具(如 Windows 中的 ipconfig 命令)查看和验证配置的正确性。

(四)网络故障排查与解决设置一些网络故障,如 IP 地址冲突、网络连接中断等,然后通过相关的工具和技术手段进行故障排查和解决。

学习使用 ping 命令、tracert 命令等网络诊断工具,分析故障产生的原因,并采取相应的解决措施。

四、实验结果与分析(一)网络拓扑结构搭建结果成功构建了包含多个子网的网络拓扑结构,各个设备之间能够正常通信。

通过查看设备的状态指示灯和配置信息,验证了网络连接的正确性。

(二)网络协议分析结果通过 Wireshark 捕获到的数据包,清晰地看到了 TCP 三次握手的过程,以及 IP 数据包的分片和重组。

计算机网络套接字编程实验报告精选全文完整版

计算机网络套接字编程实验报告精选全文完整版

可编辑修改精选全文完整版计算机网络套接字编程实验报告课程:计算机网络项目:实验2 套接字编程一、实验目的1掌握客户机与服务器的通信原理。

2掌握WinSocket编程技术,实现两机间的通信。

二、实验原理在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。

该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。

客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

2、等待客户请求到达该端口。

3、接收到重复服务请求,处理该请求并发送应答信号。

4、返回第二步,等待另一客户请求5、关闭服务器。

客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口。

2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……3、请求结束后关闭通信通道并终止。

面向连接的应用程序流程图:三、实验内容:分别用TCP和UDP实现套接字编程,实现小写字母转大写!四、实验结果与分析:实验包含四个程序,如下:TCPClient:TCPServer:UDPClient:UDPSever:程序运行结果:需要把hostname改成主机IP地址,用ipconfig命令可得到本地IP。

运行结果:思考题:在一台主机上安装编译用java写的TCPClient和UDPClient程序,在另一台主机上安装编译TCPServer和UDPServer程序。

那么1:在运行TCPCserver运行TCPClient会发生什么现象?为什么?2:在运行UDPCserver运行UDPClient会发生什么现象?为什么?3:如果你对客户机端和服务器端使用了不同的端口,将发生什么现象?答:1.2.3都什么都不会发生,因为tcp、udp server程序无非是绑定了一个特定的端口,但是client端使用的端口都是随机产生的,不必要client 和server 的tcp和udp端口必须一致。

套接字编程实验报告

套接字编程实验报告

Programing 实验物联2班201208080228 赵智慧一、实验题目:利用套接字编程,编写出TCP和UDP的客户机、服务器程序进行交互二、实验代码:1.TCP服务器:package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .ServerSocket;import .Socket;public class TCPServer {public static void main(String[] args) throws IOException{ServerSocket server=new ServerSocket(7999);System.out.println("server ok");Socket socket=server.accept();BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream()));String str=bf.readLine();while(str!=null){System.out.println(str);str=bf.readLine();}}}2.TCP客户机:package TCP;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import .Socket;import .UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException{String sentence;InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);Socket clientSocket = new Socket("127.0.0.1",7999);sentence = inFromUser.readLine();OutputStream os = clientSocket.getOutputStream();PrintWriter oos=new PrintWriter(os);os.write(sentence.getBytes());clientSocket.close();}}3.UDP服务器:package UDP;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;public class UDPServer {public static void main(String[] args) throws Exception{DatagramSocket serverSocket = new DatagramSocket(9876); //所有发送和接收的数据都将通过该套接字//因为UDP无连接,所以无需创建一个新的套接字监听新的请求byte[] receive1 = new byte[1024];byte[] receive2 = new byte[1024];byte[] send1 = new byte[1024];byte[] send2 = new byte[1024];byte[] send3 = new byte[1024];while(true){DatagramPacket receivePacket = new DatagramPacket(receive1, receive1.length);serverSocket.receive(receivePacket);String str = new String(receivePacket.getData()); //从分组中提取出数据,并存入str中InetAddress ip = receivePacket.getAddress(); //提取IP地址int port = receivePacket.getPort(); //提取客户机端口号String ask = "请选择:1.将其转化为大写 2.将a字符替换为c字符";send1 = ask.getBytes();DatagramPacket sendPacket1 = new DatagramPacket(send1, send1.length, ip,port);serverSocket.send(sendPacket1);DatagramPacket receivePacket2 = new DatagramPacket(receive2, receive2.length);serverSocket.receive(receivePacket2);String str2 = new String(receivePacket2.getData());if(str2.toCharArray()[0]=='1'){String capitalizedSentence = str.toUpperCase();send3 = capitalizedSentence.getBytes();DatagramPacket sendPacket3 = new DatagramPacket(send3, send3.length, ip,port);serverSocket.send(sendPacket3);}else{String change = str.replace('a', 'c');send2 = change.getBytes();DatagramPacket sendPacket2 = newDatagramPacket(send2, send2.length, ip,port);serverSocket.send(sendPacket2);}}}}4.UDP客户机:package UDP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;public class UDPClient {public static void main(String[] args) throws IOException{InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);DatagramSocket clientSocket = new DatagramSocket(); //客户机套接字InetAddress IPAddress = InetAddress.getByName("127.0.0.1");byte[] sendData1 = new byte[1024];byte[] sendData2 = new byte[1024];byte[] receiveData1 = new byte[1024];byte[] receiveData2 = new byte[1024];String sentence = inFromUser.readLine();sendData1 = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData1, sendData1.length,IPAddress,9876);clientSocket.send(sendPacket);DatagramPacket receivePacket1 = new DatagramPacket(receiveData1, receiveData1.length);clientSocket.receive(receivePacket1);String modifiedData1 = new String(receivePacket1.getData());System.out.println("Server:"+modifiedData1);String sentence2 = inFromUser.readLine();sendData2 = sentence2.getBytes();DatagramPacket sendPacket2 = new DatagramPacket(sendData2, sendData2.length,IPAddress,9876);clientSocket.send(sendPacket2);DatagramPacket receivePacket2 = new DatagramPacket(receiveData2, receiveData2.length);clientSocket.receive(receivePacket2);String modifiedData2 = new String(receivePacket2.getData());System.out.println("Server:"+modifiedData2);clientSocket.close();}}三、实验分析:TCP提供可靠的数据传输,而UDP提供不可靠的运输服务,在套接字编程方面,UDP 客户机使用的是DatagramSocket,而TCP客户机使用的是Socket。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三、WINSOCK套接字编程实验报告序号:姓名:刘易学号: 20101150040 成绩指导老师:1.实验目的:用C或JA V A语言编写客户端、服务器程序,实现基于TCP或UDP的网络通信数据传输服务,熟悉基于TCP或UDP的Socket编程原理。

2.实验环境:建立在TCP/IP 网络体系结构之上计算机网络实验环境。

各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。

计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。

3.实验指导:参见套接字编程实验指导4.实验步骤(1)运行指导书中给出的参考程序,分析实验结果,并回答问题(1)-(3)(2)根据给定参考程序修改代码,完善修改服务器和客户端的功能。

并回答问题(4)-(5)5.实验结果分析(1)为什么在服务器和客户端要包含winsock2.h文件?(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用,程序会有什么问题?(4)修改后的程序完成实现了什么功能,附上修改后的源代码。

(修改或填加的代码用波浪线标注,并填加注释),并附上实验截图客户端改变的代码:{ for(;;){memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");if((rval=recv(fd,buf,sizeof(buf),0)<0))perror("reading stream message");if(rval==0)printf("server said :%s\n",buf);}服务器端修改的代码:for(;;){memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("client said :%s\n",buf);printf("server-->");scanf("%s",&buf);rval=send(msgsock,buf,strlen(buf)+1,0);}}(5)请详细说明此实验在设计及运行时遇到的问题和解决办法,及实验体会及建议。

6. 给出客户端和服务器端详细代码和注释。

客户端总体代码:WSADATA wsaData;int err = 0 ,rval = 0 ;SOCKET fd;struct sockaddr_in servaddr;struct hostent* hp;char buf[1024] = "";wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("Can not create socket!");exit(2);}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);hp = gethostbyname("169.254.65.108"); memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr,hp->h_length);memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));if (rval < 0)printf("Can not create connect!");exit(3);}else{ for(;;){memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");if((rval=recv(fd,buf,sizeof(buf),0)<0))perror("reading stream message");if(rval==0)printf("server said :%s\n",buf);}}closesocket(fd);exit(5);}服务器端总体代码:int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";int rval= 0, len= 0, err = 0;WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){perror("opening stream socket");exit(1);}server.sin_family = AF_INET;server.sin_port = htons(MYPORT);server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR);memset(server.sin_zero, 0, sizeof(server.sin_zero));rval = bind(sock, (struct sockaddr *)&server, sizeof(server));if (rval < 0){perror("binding stream socket");exit(1);}length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) {perror("getting socket name");exit(1);}printf("socket port #%d\n", ntohs(server.sin_port));listen(sock, 5);len = sizeof(struct sockaddr);do{ msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);if (msgsock == -1)perror("accept");else{for(;;){memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("client said :%s\n",buf);printf("server-->");scanf("%s",&buf);rval=send(msgsock,buf,strlen(buf)+1,0);}}closesocket(msgsock);} while (TRUE);closesocket(msgsock);return 0;}。

相关文档
最新文档