计算机网络原理实验三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. 理解网络编程的基本原理和概念。

2. 掌握TCP/IP协议栈的基本工作原理。

3. 学习使用Socket编程实现网络通信。

4. 熟悉网络编程中的多线程编程技术。

5. 提高实际编程能力和问题解决能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 网络编程库:Winsock三、实验内容1. 网络编程基础2. Socket编程3. 多线程编程4. 客户端-服务器模式四、实验步骤1. 网络编程基础(1)了解网络编程的基本概念,如IP地址、端口号、协议等。

(2)学习TCP/IP协议栈的工作原理,包括OSI七层模型和TCP/IP四层模型。

2. Socket编程(1)学习Socket编程的基本原理,包括Socket创建、连接、发送、接收和关闭等操作。

(2)编写一个简单的TCP客户端程序,实现与服务器端的通信。

(3)编写一个简单的TCP服务器程序,接收客户端的连接请求,并实现数据交互。

3. 多线程编程(1)学习多线程编程的基本原理,了解线程、进程、并发和同步等概念。

(2)在客户端程序中添加多线程,实现同时与多个服务器进行通信。

(3)在服务器程序中添加多线程,实现同时处理多个客户端的连接请求。

4. 客户端-服务器模式(1)实现一个简单的文件传输客户端,实现文件的发送和接收。

(2)实现一个简单的文件传输服务器,接收客户端的文件传输请求,并完成文件传输。

五、实验结果与分析1. 网络编程基础通过学习网络编程基础,我们了解了网络编程的基本概念和TCP/IP协议栈的工作原理,为后续的Socket编程打下了基础。

2. Socket编程(1)通过编写TCP客户端程序,实现了与服务器端的通信,验证了Socket编程的基本原理。

(2)通过编写TCP服务器程序,接收客户端的连接请求,并实现了数据交互,进一步巩固了Socket编程的知识。

3. 多线程编程通过在客户端和服务器程序中添加多线程,实现了同时与多个服务器进行通信和同时处理多个客户端的连接请求,提高了程序的并发处理能力。

网络编程实验报告

网络编程实验报告

一、实验目的1. 掌握网络编程的基本概念和原理。

2. 熟悉常用的网络编程工具和技术。

3. 能够编写简单的网络通信程序。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 网络编程库:Winsock三、实验内容本次实验主要涉及以下几个方面的内容:1. Winsock编程基础2. TCP客户端/服务器通信3. UDP客户端/服务器通信4. 简单文件传输四、实验步骤1. Winsock编程基础(1)创建Winsock环境在Visual Studio中,使用Winsock 2库进行编程。

首先,在项目属性中添加Winsock 2库。

(2)初始化Winsock使用WSAStartup函数初始化Winsock环境。

(3)创建套接字使用socket函数创建套接字。

(4)绑定套接字使用bind函数绑定套接字。

(5)连接套接字使用connect函数连接套接字。

(6)发送和接收数据使用send和recv函数发送和接收数据。

(7)关闭套接字使用closesocket函数关闭套接字。

(8)清理Winsock环境使用WSACleanup函数清理Winsock环境。

2. TCP客户端/服务器通信(1)创建TCP服务器端创建TCP服务器端程序,监听客户端的连接请求。

(2)创建TCP客户端创建TCP客户端程序,连接到服务器端。

(3)数据交换在客户端和服务器端之间进行数据交换。

3. UDP客户端/服务器通信(1)创建UDP服务器端创建UDP服务器端程序,接收客户端的数据。

(2)创建UDP客户端创建UDP客户端程序,向服务器端发送数据。

(3)数据交换在客户端和服务器端之间进行数据交换。

4. 简单文件传输(1)创建文件传输服务器端创建文件传输服务器端程序,监听客户端的文件传输请求。

(2)创建文件传输客户端创建文件传输客户端程序,向服务器端发送文件传输请求。

(3)文件传输在客户端和服务器端之间进行文件传输。

套接字实验报告

套接字实验报告

套接字实验报告套接字实验报告引言套接字(Socket)是计算机网络中一种重要的通信机制,它允许不同计算机之间的进程进行通信。

在本次实验中,我们将学习套接字的基本概念和使用方法,并通过实际编程实现简单的网络通信。

一、套接字的基本概念1.1 套接字的定义套接字是计算机网络中用于实现进程间通信的一种机制。

它可以在不同主机之间传递数据,使得进程能够进行通信和协作。

1.2 套接字的类型套接字可以分为两种类型:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。

流式套接字提供面向连接的可靠通信,而数据报套接字则提供无连接的不可靠通信。

1.3 套接字的地址套接字的地址由IP地址和端口号组成。

IP地址用于标识主机,端口号用于标识进程。

二、套接字的使用方法2.1 创建套接字在使用套接字之前,首先需要创建一个套接字对象。

可以通过调用socket()函数来创建套接字,指定套接字的类型和协议。

2.2 绑定套接字在进行网络通信之前,需要将套接字绑定到一个特定的地址上。

可以通过调用bind()函数来实现套接字的绑定。

2.3 监听套接字如果希望套接字能够接受连接请求,需要将套接字设置为监听状态。

可以通过调用listen()函数来实现套接字的监听。

2.4 接受连接当套接字处于监听状态时,可以通过调用accept()函数来接受客户端的连接请求,并返回一个新的套接字对象,用于与客户端进行通信。

2.5 发送和接收数据一旦建立了连接,就可以通过调用send()函数来发送数据,调用recv()函数来接收数据。

三、实验过程和结果在本次实验中,我们使用Python编程语言来实现套接字的使用。

首先,我们创建一个服务器端程序和一个客户端程序。

3.1 服务器端程序服务器端程序首先创建一个套接字对象,并将其绑定到一个特定的地址上。

然后,将套接字设置为监听状态,等待客户端的连接请求。

一旦接受到连接请求,就创建一个新的套接字对象,并与客户端进行通信。

套接字编程实验总结

套接字编程实验总结

套接字编程实验总结
套接字编程实验总结
套接字编程(Socket Programming)是计算机网络中非常重要的一部分,通过套接字编程我们可以实现不同网络之间的通信。

在这次实验中,我们学习了套接字编程的常用函数,掌握了编写TCP和UDP协议的基本方式。

实验中我们先学习了TCP协议,该协议是一个面向连接的协议,它提供了可靠的数据传输,保证了数据的准确性和有序性,数据传输前需要先建立连接,传输完毕后必须断开连接。

TCP协议通常用于需要稳定传输的应用程序,如Web、FTP等。

UDP协议则是一个面向无连接的协议,它不保证数据包传输的可靠性和有序性,但传输速度很快,可以满足很多实时性要求高的应用程序,如流媒体、视频聊天等。

我们在实验中通过编写TCP和UDP实例,加深了对套接字编程的理解。

在TCP 实例中,我们先建立连接后,通过服务器端向客户端发送数据,客户端接收并回应。

在UDP实例中,我们直接通过客户端向服务器端发送数据,服务器端接收后回应。

通过实例的练习,我们掌握了TCP和UDP数据传输的规则和常用函数的使用。

总的来说,通过这次实验,我们学习了套接字编程的基本知识,掌握了TCP和UDP协议编程的思想和实现方法。

在实践中,我们还学会了怎样使用Wireshark 等工具来分析数据包,以及如何在实际应用中运用套接字编程技术。

这对于我们了解计算机网络和提高编程能力非常有帮助。

希望未来可以继续学习深入的网络编程知识,为计算机网络领域做出自己的贡献。

实验3 面向连接的网络点点通信套接字编程

实验3  面向连接的网络点点通信套接字编程

实验三、面向连接的网络点点通信套接字编程实验目的及要求:掌握TCP/IP面向连接的网络点点通信套接字编程工作原理,学会使用Winsock编制网络会话程序。

实验方法:1. 阅读文档,熟悉TCP/IP网络套接字编程的工作原理;2. 参考本实验后附录的客户与服务器程序简例,使用Visual C++输入编辑、编译、运行与调试网络会话程序;3. 在一台实验机上运行服务端程序,另一台实验机上运行客户端程序,双方利用控制台进行通信;也可在同一台机器上同时运行服务器进程、客户进程进行测试。

实验内容:(1)写出改编的 Visual C++ 网络会话源程序如下:服务器端:客户端:(2)运行、测试网络会话程序,记录测试结果,分析遇到的问题与解决的办法。

编程背景材料:1.基本概念套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。

可以将套接字看作不同主机间进程进行双向通信的端点。

在Windows中使用的套接字叫Winsock。

根据网络通信的特征,套接字可分为两类:流套接字和数据报套接字。

流套接字是面向连接的,它提供双向的、有序的、无重复并且无记录边界的数据流服务,适用于处理大量数据。

数据报套接字是无连接的,它支持双向的数据流,但并不保证数据传输的可靠性、有序性和无重复性。

2.Winsock编程原理Winsock分1.1版和2.x版,从Windows98开始都使用2.x版。

Winsock 2网络应用程序运行时通过使用系统目录中的动态链接库ws2_32.dll访问TCP/IP协议栈,用VC++6.0开发时,Winsock 2中所用的函数声明、常数等等均是在头文件winsock2.h内定义的,若想使用Winsock 2,须连接的库是ws2_32.lib。

应用程序中使用流套接字和数据报套接字的方法如下框图所示:(1) Winsock的启动和中止由于Winsock 2提供的API服务是以动态链接库ws2_32.dll实现的,所以必须先调用WSAStartup函数对ws2_32.dll进行加载初始化,协商Winsock的版本支持,并分配必要的资源。

03实验三 WinSock实现网络通信【必开】

03实验三 WinSock实现网络通信【必开】

实验三WinSock实现网络通信一、实验目的掌握利用WinSock控件实现网络通信的方法。

二、实验任务与要求1. 使用Visual Basic建立通信界面。

2. 利用WinSock控件编程实现点对点(点对多点)通信。

三、实验背景Sockets是在Unix系统上提出来的,一开始主要是用于本地通讯,但很快就应用到C/S体系上。

MicroSoft公司在此基础上创建了WinSock控件,专门用于Windows接口,与Sockets完全兼容。

Winsock控件对用户来说是不可见的,它提供了访问TCP 和UDP 网络服务的方便途径。

Microsoft Access、Visual Basic、Visual C++ 或Visual FoxPro 的开发人员都可使用它。

为编写客户或服务器应用程序,不必了解TCP 的细节或调用低级的Winsock APIs。

通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。

先来看网络通信协议的基础和选择:1.TCP(数据传输协议)基础数据传输协议允许创建和维护与远程计算机的连接。

连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用Connect 方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用Listen 方法。

当客户计算机需要连接时就会发生ConnectionRequest 事件。

为了完成连接,可调用ConnectionRequest 事件内的Accept 方法。

建立连接后,任何一方计算机都可以收发数据。

为了发送数据,可调用SendData 方法。

当接收数据时会发生DataArrival 事件。

调用DataArrival 事件内的GetData 方法就可获取数据。

2.UDP(用户数据文报协议)基础用户数据文报协议(UDP) 是一个无连接协议。

套接字编程实验总结

套接字编程实验总结

套接字编程实验总结套接字编程是计算机网络编程中非常重要的一部分,通过套接字可以实现不同计算机之间的通信与数据交换。

在进行套接字编程的实验过程中,我深刻体会到了其重要性及应用价值。

下面我将结合自己的实验经历,总结出一些关键的要点和经验。

我在实验中学习到了如何创建套接字、绑定地址和端口、监听连接请求以及接受和发送数据等基本操作。

这些操作是套接字编程的基础,也是我们进行网络通信必须掌握的内容。

在实验中,我通过不断地练习和调试,逐渐掌握了这些操作的技巧和方法。

我发现在套接字编程实验中,错误处理是非常重要的。

由于网络环境的不确定性,很容易出现各种错误,比如连接超时、数据丢失等。

因此,在编写代码时,我要注意添加足够的错误处理机制,及时捕获和处理各种异常情况,以确保程序的稳定性和可靠性。

我还学习到了如何利用多线程和多进程来实现并发通信。

在实际应用中,通常需要同时处理多个连接请求,这时就需要使用多线程或多进程来实现并发处理。

通过实验,我掌握了多线程和多进程编程的基本原理和方法,能够有效地提高程序的运行效率和响应速度。

我还了解到了套接字编程中一些高级特性的应用,比如SSL加密、非阻塞IO、UDP通信等。

这些特性可以进一步提升网络通信的安全性和效率,对于一些对数据传输要求较高的应用场景非常有用。

总的来说,通过套接字编程实验,我不仅学到了网络编程的基础知识和技能,还提升了自己的问题解决能力和编程能力。

在未来的学习和工作中,我将继续深入研究网络编程领域,不断提升自己的技术水平,为实现更复杂的网络应用做好准备。

希望我的总结和经验能够对其他同学在学习套接字编程时有所帮助,共同进步,共同成长。

实验套接字编程实验

实验套接字编程实验

注意:实验课程名称统一填写“计算机网络实验”
实验 2
实验项目名称:套接字编程实验
实验日期:
实验地点:
实验目的:
1.理解套接字的概念,区分TCP套接字和UDP套接字;
2.掌握Python语言下的套接字编程技术。

实验内容:
1.参照教材
2.7的内容,分别利用TCP和UDP套接字编程技术,
使用Python语言编程完成从客户端输入一行字符,发送到服务器后,由服务器转化成大写字母,回送到客户端并显示。

2.调试、运行所建立的程序。

3.回答习题31、32的问题。

实验步骤:
1.预备知识:Python语言编程基础、Python语言网络编程技术;
2.下载Python语言及其集成开发工具并安装;
3.输入Python源程序并保存、运行调试;
4.分别在不同主机上或同一台主机下运行服务器程序和客户机程
序,观察客户机和服务器的通信交互过程。

5.完成实验报告,内容包括源程序和运行界面。

附:操作运行界面
(1)TCP客户端运行界面
(2)TCP服务器端运行界面
(3)UDP客户端运行界面
(4)UDP服务器端运行界面。

winsock编程实验报告

winsock编程实验报告

winsock编程实验报告Winsock编程实验报告引言Winsock是Windows操作系统中用于网络通信的编程接口,它提供了一组函数和数据结构,使程序员能够在Windows平台上进行网络编程。

在本实验中,我们将探讨如何使用Winsock编程接口来实现基本的网络通信功能。

实验目的本实验的目的是通过Winsock编程实现一个简单的客户端-服务器模型,了解基本的网络通信原理和编程方法。

实验环境本实验使用了Windows操作系统和Visual Studio集成开发环境。

在实验过程中,我们使用了C/C++语言进行编程。

实验步骤1. 初始化Winsock库在程序中调用WSAStartup函数来初始化Winsock库,这是进行网络编程的第一步。

2. 创建套接字使用socket函数创建一个套接字,套接字是网络通信的基本单元,它包含了通信的协议和地址信息。

3. 绑定套接字使用bind函数将套接字绑定到本地地址和端口上,这样就可以在这个地址上进行通信。

4. 监听连接如果是服务器端程序,需要调用listen函数来监听连接请求,等待客户端程序的连接。

5. 建立连接客户端程序使用connect函数来连接服务器端程序,建立通信连接。

6. 发送和接收数据使用send和recv函数来发送和接收数据,实现网络通信功能。

实验结果经过实验,我们成功实现了一个简单的客户端-服务器模型,在这个模型中,客户端程序能够向服务器端程序发送数据,并接收服务器端程序的响应。

我们也测试了程序的稳定性和可靠性,发现程序能够正常工作并且没有出现明显的问题。

结论通过本次实验,我们了解了Winsock编程接口的基本用法,掌握了基本的网络通信原理和编程方法。

网络通信是现代计算机应用中非常重要的一部分,掌握网络编程技术对于我们的职业发展具有重要意义。

在今后的学习和工作中,我们将继续深入学习网络编程技术,不断提升自己的能力和水平。

网络程序设计实验报告-Winsock编程接口实验

网络程序设计实验报告-Winsock编程接口实验

网络程序设计实验报告实验名称: Winsock编程接口实验实验类型:____验证型实验_____ __指导教师:______________________专业班级:_____________________姓名:_______________________学号:_____________________电子邮件:____________实验地点:______ _______实验日期2013 年 3 月29 日实验成绩:__________________________一、实验目的●掌握Winsock的启动和初始化;●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。

二、实验设计由实验内容可以知道:1、编写程序能同时实现对多个域名的解析。

比如在控制台输入:getip ,能输出和对应的IP地址列表。

2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。

首先要了解一些基本的知识gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的基本知识gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。

结构的声明与gethostaddr()中一致。

之后要根据内容画出函数流程图三、实验过程(包含实验结果)1.在实验过程中调用GetAdaptersInfo()时,出现了undeclared identifier的报错,原因是没有包含其头文件,之后进行一些修改解决了问题.2.实验结果3.选择查看本机信息四、讨论与分析1.Winsock初始化的作用是什么?答:使用winsock初始化可加载winsock编程的动态链接库。

2.给出GetAdaptersInfo()函数的正确使用方法。

GetAdaptersInfo 函数使用方法:1.包含头文件IpHlpApi.h,其库文件为IpHlpApi.lib(已将安装SDK,并将其连接至VC)2.声明一个IP_ADAPTER_INFO 结构指针变量pAdapterInfo,一个ULONG变量ulOutBufLen。

Winsock实验

Winsock实验

从图中看出Socket是应用层与TCP/IP协议 族通信的中间软件层,是一组接口,对用户来 说就是让Socket去组织数据,以符合指定的协 议。 套接口,就是一个指向传输提供者的句柄。 Win32中,套接口不同于文件描述符,所以它是 一个独立的类型——SOCKET。套接字接口 (SocketInterface)就是一种API , API实现的 作用是把API定义的具体操作和对象映射到协议 定义的抽象服务集上。
套接口工作原理

由socket提供三种类型的套接字知道服务方式主要 有两种,一种是面向连接,一种是无连接的。面向连接 服务器处理的请求往往比较复杂,不是一来一去的请求 应答所能解决的,而且往往是并发服务器。无连接服务 器一般都是面向事务处理的,一个请求、一个应答就完 成了客户程序与服务程序之间的相互作用。使用面向连 接的套接口编程,可以通过图来表示。
socket提供三种类型的套接字:
1.流式套接字(SOCK_STREAM)
提供一个面向连接的、可靠的数据传输服务, 数据无差错、无重复地发送,且按发送顺序接 收。 内设流量控制,避免数据流超限;数据被看作 是字节流,无长度限制。 文件传输协议(FTP)即使用流式套接字。
2.数据报式套接字(SOCK_DGRAM) 提供一个无连接服务。 数据报以独立包形式被发送,不提供无错保证,数 据可能丢失或重复,且接收顺序混乱。 网络文件系统(NFS)使用数据报式套接字。 3.原始式套接字(SOCK_RAW) 该接口允许对较低层协议,如IP、ICMP直接访问。 常用于检验新的协议实现或访问现有服务中配置的 新设备
(1)应用VisualC++中MFCCSocket类,实现网络数 据传输。 (2)制作实用的局域网数据传输程序。
  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;}。

相关文档
最新文档