Socket编程利用TCP协议的实验报告精编版

合集下载

网络编程实验报告

网络编程实验报告

网络编程实验报告实验一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()方法。

Socket实现的UDPTCP通信试验

Socket实现的UDPTCP通信试验

计算机通信网络实验通信实验UDP/TCP一、实验目的熟练掌握UDP、TCP Client/Server模式的通信原理二、实验内容传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议。

面向连接是指一次正常的TCP传输需要通过在TCP客户端和TCP服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。

可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。

TCP通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。

要通过TCP传输数据,必须在两端主机之间建立连接。

举例说明,TCP客户端需要和TCP服务端建立连接,过程如图所示:客户端告诉服务标志置位。

客户端向服务端提出连接请求。

这时TCP SYN第一步中,。

报头的序列号区中插入自己的ISN端序列号区域合法,需要检查。

客户端在TCP,同时确认收)(SYN标志置位服务端收到该TCP分段后,在第二步以自己的ISN回应)。

TCP分段(ACK标志置位到客户端的第一个TCP。

到此为止建立完整的ISN(ACK标志置位)在第三步中,客户端确认收到服务端的连接,开始全双工模式的数据传输过程。

模式的通信程序。

根据以上内容编写一个TCP Client/Server 事实上网络程序是由两个部分组成:客户端、服务器端它们的建立步骤如下:服务器端socket-->bind-->listen-->accept客户端socket-->connect实验步骤三、TCP Client/Server模式的通信程序;UDP1.编写、调试并运行自己编写的实现程序;2.模式的工作原理,比较二者的不同,如出现异常情况,在TCP Client/Server3.了解实验报告中写出原因分析;4.保留编写的实现程序。

四、实验过程1.TCP Client/Server模式的通信程序服务器端操作socket(套接字):1.在初始化阶段调用WSAStartup()2、建立Socket3、绑定端口4、监听5、服务器端接受客户端的连接请求6、发送及接收信息7、结束socket 连接相应的程序:Server:import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStreamReader;import .ServerSocket;import .Socket;public class Server {public static final int PORT = 12345;//监听的端口号public static void main(String[] args) {祓瑳浥漮瑵瀮楲瑮湬尨服务器启动...\n);Server server = new Server();server.init();}public void init() {try {ServerSocket serverSocket = new ServerSocket(PORT);while (true) {// 一旦有堵塞, 则表示服务器与客户端获得了连接Socket client = serverSocket.accept();// 处理这次连接new HandlerThread(client);}} catch (Exception e) {祓瑳浥漮瑵瀮楲瑮湬尨服务器异常: + e.getMessage());}}private class HandlerThread implements Runnable {private Socket socket;public HandlerThread(Socket client) {socket = client;new Thread(this).start();}public void run() {try {// 读取客户端数据DataInputStream input = newDataInputStream(socket.getInputStream());String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛EOFException// 处理客户端数据祓瑳浥漮瑵瀮楲瑮湬尨客户端发过来的内容: + clientInputStr);// 向客户端回复信息DataOutputStream out = newDataOutputStream(socket.getOutputStream());祓瑳浥漮瑵瀮楲瑮尨请输入:\t);// 发送键盘输入的一行String s = new BufferedReader(newInputStreamReader(System.in)).readLine();out.writeUTF(s);out.close();input.close();} catch (Exception e) {祓瑳浥漮瑵瀮楲瑮湬尨服务器run 异常: + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (Exception e) {socket = null;祓瑳浥漮瑵瀮楲瑮湬尨服务端finally 异常: +e.getMessage());}}}}}}Client//package com.defonds.socket.begin;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import .Socket;public class Client {public static final String IP_ADDR = 汜捯污潨瑳;//服务器地址public static final int PORT = 12345;//服务器端口号public static void main(String[] args) {System.out.println(客户端启动?尮);System.out.println(当接收到服务器端字符为 \OK\ 的时候, 客户端将终止屜屮);while (true) {Socket socket = null;try {//创建一个流套接字并将其连接到指定主机上的指定端口号socket = new Socket(IP_ADDR, PORT);//读取服务器端数据DataInputStream input = newDataInputStream(socket.getInputStream());//向服务器端发送数据DataOutputStream out = newDataOutputStream(socket.getOutputStream());System.out.print(请输入?屜屴);String str = new BufferedReader(newInputStreamReader(System.in)).readLine();out.writeUTF(str);String ret = input.readUTF();System.out.println(服务器端返回过来的是? + ret);则断开连接 OK 如接收到//if (作屋.equals(ret)) {System.out.println(客户端将关闭连接);Thread.sleep(500);break;}out.close();input.close();} catch (Exception e) {System.out.println(客户端异常尺 + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (IOException e) {socket = null;System.out.println(客户端 finally 异常尺 +e.getMessage());}}}}}}运行截图:Server::Client心得体会五、在实际的编程UDP/TCP通信实验中,我不仅进一步在本次的编程命令,而且socket熟练掌握模式的通信原理有了更深的了解,知道了它们之间的差异,Client/ServerUDP中对、TCP模式的通信需要“三次握手”建立连接,然后才能进行通信,而且服务器不TCPClient/Server 模式的通信却可以。

实验07-TCP_IP+Socket编程

实验07-TCP_IP+Socket编程

《计算机网络》实验报告实验序号:07 实验项目名称:TCP_IP Socket编程学号姓名专业、班实验地点实1-514 指导教师实验时间2013-11-26一、实验目的及要求1、通过对路由器安装与配置实验,加深对相关网络设备工作原理理解,掌握其常见产品的安装与配置方法,为将来从事网络工程建设打下基础。

2、通过实验,掌握路由器的基本参数配置、网络接口配置和路由协议配置,掌握静态路由的配置方法。

二、实验设备(环境)及要求计算机;学生不许把食物带到机房吃;不许上网做与实验无关的内容;不许同学之间聊天;保持实验室安静卫生。

下课把键盘,座椅放回原处。

三、实验内容与步骤1.分别编写基于TCP的socket程序服务端和客户端,要求客户端能发送消息到服务端,服务端再把此消息返回给客户端。

服务端:(1)打开vc++6.0,File-》new-》Projects-》Win32 Console Application,输入Project name,例如SimpleTCP_s,选择location后单击OK,选择simple application,单击ok。

(2)打开SimpleTCP_s.cpp,输入如下内容:#include "stdafx.h"#include <stdio.h>#include <winsock2.h> //WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以//可以用WINSOCK2.H);#pragma comment(lib, "WS2_32.lib")//Ws2_32.lib(WINSOCK API连接库文件).#define BUF_SIZE 1024int main(int argc, char* argv[]){WSADA TA wsaData;SOCKET socketL; // socket for listeningSOCKET socketC; // socket for CommunicationSOCKADDR_IN serverAddr;int nRet = -1;char recvbuf[BUF_SIZE];if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup failed!\n");return 1;}socketL = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(5678);serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(socketL, (SOCKADDR*)&serverAddr, sizeof(serverAddr));listen(socketL, 5);socketC = accept(socketL, NULL, NULL);if (socketC != INV ALID_SOCKET){nRet = recv(socketC, recvbuf, sizeof(recvbuf), 0);if (nRet > 0)printf("%s ", recvbuf);}closesocket(socketC);closesocket(socketL);WSACleanup();printf("请按回车键关闭");getchar();return 0;}(3)编译工程客户端:(1)和服务端一样操作,建立SimpleTCP_c工程。

socket编程实验报告

socket编程实验报告

socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它允许不同的计算机之间进行数据交换和通信。

通过实验,我们可以更深入地了解Socket编程的原理和应用。

实验目的:1. 了解Socket编程的基本原理和概念2. 掌握Socket编程的基本操作和使用方法3. 实现简单的客户端和服务器端通信实验环境:1. 操作系统:Windows或Linux2. 编程语言:C/C++或Python实验步骤:1. 理解Socket编程的基本原理和概念,包括TCP和UDP协议2. 编写客户端程序,建立与服务器端的连接3. 编写服务器端程序,接受客户端的连接并进行数据交换4. 测试客户端和服务器端的通信功能,包括发送和接收数据实验结果:通过实验,我们成功实现了简单的客户端和服务器端通信。

我们能够在客户端发送数据,服务器端接收并处理数据,然后再将处理结果返回给客户端。

这证明了Socket编程的可行性和实用性。

实验总结:Socket编程是一种强大而灵活的通信方式,它可以实现不同计算机之间的数据交换和通信。

通过本次实验,我们更加深入地了解了Socket编程的原理和应用,掌握了基本的操作和使用方法。

我们相信在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

通过这次实验,我们对Socket编程有了更深刻的理解,也提升了我们的编程能力和实践能力。

我们相信,在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。

计算机网络实验报告 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)创建套接字并通过指定端口请求与服务器建立连接。

通信网络实验 三tcpsocket编程

通信网络实验 三tcpsocket编程

通信网络实验报告实验三socket(tcp)编程通信网络实验一、实验背景Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。

尽管应用开发人员很少需要在该层编写代码,但是理解socket API还是非常重要的。

(1)高层设施是构建于socket API之上的,它们是利用socket API提供的操作来实现。

(2)对于响应时间要求较高或运行于有限资源平台上的应用,甚至socket API是唯一可用的进程间通信设施。

二、服务器端程序int _tmain(intargc, _TCHAR* argv[]){printf("此窗口为服务器,正在监听端口:8888\n");SOCKET sockserv=socket(AF_INET, SOCK_STREAM,0);SOCKADDR_IN m_addr;m_addr.sin_family = AF_INET;m_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);m_addr.sin_port = htons(8888);bind(sockserv, (SOCKADDR*)&(m_addr), sizeof(m_addr));listen(sockserv, 2);SOCKADDR_IN addrclient;intlen = sizeof(SOCKADDR);while(1){SOCKET sockConn=accept(sockserv, (SOCKADDR*)&addrclient, &len);charrecvbuf[100];charsendbuf[100];memset(recvbuf,0,100);sprintf(sendbuf,"我是服务器,通网实验做了吗");send(sockConn,sendbuf,strlen(sendbuf)+1,0);recv(sockConn,recvbuf,100,0);printf("%s\n",recvbuf);closesocket(sockConn);}WSACleanup();return 0;}三、客户端程序printf("此窗口为客户端程序\n");SOCKET sockclient=socket(AF_INET, SOCK_STREAM,0);SOCKADDR_IN addrsrv;addrsrv.sin_family = AF_INET;addrsrv.sin_addr.S_un.S_addr= inet_addr("127.0.0.1");addrsrv.sin_port = htons(8888);connect(sockclient, (SOCKADDR*)&(addrsrv), sizeof(addrsrv));charrecvbuf[100];memset(recvbuf,0,100);charsendbuf[100];recv(sockclient,recvbuf,100,0);printf("%s\n",recvbuf);sprintf(sendbuf,"我是小强我的通网实验做了。

网络编程_实验报告

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

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

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

4. 增强实际操作能力,提高网络编程水平。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm4. 网络环境:校园局域网三、实验内容本次实验主要实现一个基于TCP协议的简单网络通信程序,包括客户端和服务器端。

1. 服务器端服务器端负责监听客户端的连接请求,接收客户端发送的数据,并回显给客户端。

```pythonimport socket# 创建socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 12345# 绑定端口server_socket.bind((host, port))# 设置最大连接数,超过后排队server_socket.listen(5)print("等待客户端连接...")while True:# 建立客户端连接client_socket, addr = server_socket.accept()print("连接地址:", addr)while True:# 接收客户端数据data = client_socket.recv(1024)if not data:break# 发送数据回客户端client_socket.send(data)# 关闭连接client_socket.close()```2. 客户端客户端负责向服务器端发送数据,并接收服务器端回显的数据。

```pythonimport socket# 创建socket对象client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 12345# 连接服务器client_socket.connect((host, port))# 发送数据client_socket.send("Hello, Server!")# 接收数据data = client_socket.recv(1024)print("从服务器接收到的数据:", data)# 关闭连接client_socket.close()```四、实验步骤1. 编写服务器端代码,并运行程序。

tcp实验报告

tcp实验报告TCP实验报告一、实验目的TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在互联网通信中扮演着重要的角色。

本实验旨在通过实际操作和观察,深入理解TCP协议的工作原理和特点。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.93. 实验工具:Wireshark三、实验步骤与结果1. 建立TCP连接通过Python的socket库,我们可以轻松地创建TCP连接。

在本实验中,我们编写了一个简单的服务器端和客户端程序,通过本地主机进行通信。

2. 数据传输与流量控制在TCP连接建立后,我们进行了数据的传输实验。

首先,我们发送了一个较小的数据包,观察到数据包的传输过程中,TCP协议会自动进行流量控制,确保数据的可靠传输。

接着,我们发送了一个较大的数据包,发现TCP会将大数据包拆分成多个小数据包进行传输,并在接收端进行重组。

3. 拥塞控制为了模拟网络拥塞的情况,我们在实验中人为地降低了网络带宽。

通过Wireshark抓包分析,我们观察到TCP协议在发现网络拥塞时,会自动减少发送速率,以避免网络的过载。

同时,我们还注意到TCP协议会根据网络的状况动态调整拥塞窗口的大小,以提高网络的利用率。

4. 可靠性与重传机制为了测试TCP协议的可靠性,我们在实验中故意模拟了数据包丢失的情况。

通过Wireshark的分析,我们发现当发送端未收到确认消息时,会自动触发重传机制,确保数据的可靠传输。

同时,TCP还会根据超时时间的动态调整,以适应不同网络环境下的传输速度。

五、实验总结通过本次实验,我们深入了解了TCP协议的工作原理和特点。

TCP作为一种可靠的传输协议,在互联网通信中发挥着重要的作用。

它通过流量控制、拥塞控制和重传机制等手段,确保了数据的可靠传输,并适应了不同网络环境的变化。

在今后的学习和实践中,我们将进一步深入研究TCP协议的细节,并结合实际应用场景,优化网络通信的性能和可靠性。

Socket编程实验报告

实验报告实验一Socket编程一、实验目的通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。

二、实验内容①学习socket编程使用的类和接口,着重掌握基于TCP协议的socket。

②编写服务器端的应用程序③编写客户端的应用程序④实现服务器端与客户端的交互三、实验代码1.服务器端程序过程:在端口5000上创建一个等待连接的ServerSocket对象server:server=new ServerSocket(5000);接着调用server对象的accept()方法等待某客户程序发出连接请求。

该方法一直阻塞直到有客户连接到带端口。

一旦有客户发送正确请求,则连接成功,accept()方法返回一个Socket对象,于是得到了一个新的用于通信的Socket对象,通信链路建立成功。

然后利用Socket 类提供的方法创建Socket对象的输入流和输出流。

此后即于客户端进行通信,直到客户端断开连接即关闭各个流结束通信。

代码如下:import .*;import java.io.*;class aa{static public void main (String args[]) throws IOException{ServerSocket server=null;Socket socket=null;InputStream is=null;OutputStream os=null;DataInputStream in=null;PrintStream out=null;try{ //在端口5000注册服务server=new ServerSocket(5000);socket =server.accept();//侦听连接请求,等待连接System.out.println("**********************服务器端界面*************************");System.out.println("与客户端连接成功!");System.out.println("");System.out.println("对话内容为:");System.out.println("");System.out.println("等待客户发送信息.....");//获取对应的Socket的输入/输出流is=socket.getInputStream();os=socket.getOutputStream();//建立数据流in= new DataInputStream(is);out =new PrintStream(os);//表示向对方输出out.println("Welcome!");//表示向对方输出String str=in.readLine();//逐行读取do{System.out.println("客户端说:"+ str);str=in.readLine();}while(str.trim().equals("BYE")) //如果是“BYE”就退出System.out.println("客户想要离开");}catch(Exception e) //捕获程序异常{System.out.println("Error:"+e);}finally{is.close();//关闭输入流os.close();//关闭输出流in.close();//关闭数据输入流socket.close();//关闭socket}}}2.客户端程序过程:首先创建一个指向服务器的指定端口号(5000)的Socket对象socket:socket=new Socket("localhost",5000);此时服务器指定为本地计算机,若要在网络中指定服务器,只需要将参数localhost改成相应的服务器名或者IP地址即可。

tcp协议实验报告

竭诚为您提供优质文档/双击可除tcp协议实验报告篇一:Tcp实验报告Tcp实验报告一、实验目的1.深入理解Tcp原理,掌握连接状态控制、可靠传输等重要机制;2.为应用层提供网络编程接口,即socket接口。

二、实验要求1.理解Tcp的主要原理,针对客户端角色的、“停-等”模式的Tcp,设计接收和发送流程。

2.编程实现Tcp段的接收流程,重点是段接收的有限状态机3.编程实现Tcp段的发送流程,完成Tcp段的封装处理。

4.编程实现客户端socket接口函数三、编程实现1.停-等协议的实现停-等协议主要体现在stud_tcp_send()函数和stud_tcp_recv()和函数中。

实现的主要思路是:a)调用stud_tcp_send()发送一个数据包时,直到收到ack包并把ack交给stud_tcp_input()处理才退出b)调用stud_tcp_recv()接收一个数据包成功后,紧接着发送一个相应的ack包才退出上述两个设计保证了发送和接收窗口大小为12.接收流程的有限状态机首先检查校验和与序号是否正确,只有当这两者都无误之后才进入状态机部分。

状态机基于switch结构实现,根据当前Tcb的状态分情形讨论状态的变化。

处理流程如下3.发送时的封装和有限状态机a)查看当前的Tcb是否为空,为空则创建当前的Tcbb)封装数据i.ii.iii.iv.v.vi.拷贝数据设置源端口和目的端口设置包序列和ack 序号设置包头长度设置flag设置windowsize和urgentpointerc)改变状态d)变换字节序将字节序从本地序变成网络序4.各接口函数的实现a)stud_tcp_socket()b)stud_tcp_connect()c)stud_tcp_send()d)stud_tcp_recv()e)stud_tcp_close()5.校验和的计算与Ip包的校验类似,但是要求对伪首部进行校验伪首部由以下部分组成:a)32位Ip源地址b)32位Ip目的地址篇二:Tcp协议实验网络课第四次上机实验报告实验内容实验内容主要包括:?设计保存Tcp连接相关信息的数据结构(Tcb);?Tcp协议的接收处理和封装发送;?Tcp协议提供的socket函数接口。

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

S o c k e t编程利用T C P 协议的实验报告精编版 MQS system office room 【MQS16H-TTMS2A-MQSS8Q8-MQSH16898】
Socket编程报告(TCP/IP协议)
一.实验目的
通过C++来实现TCP/IP协议下的Socket编程,掌握TCP协议的算法实现。

二.实验原理
客户端建立Socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用CloseSocket关闭Socket
服务端建立Socket,声明自身的端口号和地址并绑定到Socket,使用Listen打开监听,然后不断用Accept去查看是否有连接,如果有,捕获Socket,并通过Recv获取消息的内容,通信完成后调用CloseSocket关闭这个对应Accept到的Socket,如果不再需要等待任何客户端连接,那么用CloseSocket关闭掉自身的Socket
三.实验代码(C++实现)
服务器端代码如下:
#pragmaonce
#include<>
#include<>
#pragmacomment(lib,"")
classCServerNet
{
public:
.\n");
();
}
else
printf("serverNetinitfailedwitherror:%d\n",iRlt);
system("pause");
}
客户端代码如下:
#pragmaonce
#include<>
#include<>
#pragmacomment(lib,"")
classCClientNet
{
public:
//连接上指定服务器
intConnect(intport,constchar*address);
//发送信息
intSendMsg(constchar*msg,intlen);
//关闭
voidClose();
private:
SOCKETm_sock;
};
intCClientNet::Connect(intport,constchar*address)
{
intrlt=0;
//用于记录错误信息并输出
intiErrMsg;
//启动WinSock
WSADatawsaData;
iErrMsg=WSAStartup(MAKEWORD(1,1),&wsaData);
if(iErrMsg!=NO_ERROR)
//有错误
{
printf("failedwithwsaStartuperror:%d\n",iErrMsg);
rlt=1;
returnrlt;
}
//创建Socket
m_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_sock==INVALID_SOCKET)
//创建Socket失败
{
printf("socketfailedwitherror:%d\n",WSAGetLastError());
rlt=2;
returnrlt;
}
//目标服务器数据
sockaddr_insockaddrServer;
=AF_INET;
=port;
//连接,sock与目标服务器连接
iErrMsg=connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrServer));
if(iErrMsg<0)
{
printf("connectfailedwitherror:%d\n",iErrMsg);
rlt=3;
returnrlt;
}
returnrlt;
}
intCClientNet::SendMsg(constchar*msg,intlen)
{
intrlt=0;
intiErrMsg=0;
//发送消息,指定sock发送消息
iErrMsg=send(m_sock,msg,len,0);
if(iErrMsg<0)
//发送失败
{
printf("sendmsgfailedwitherror:%d\n",iErrMsg);
rlt=1;
returnrlt;
}
returnrlt;
}
voidCClientNet::Close()
{
closesocket(m_sock);
}
intmain()
{
CClientNetclient;
printf("Connect\n");
//发送消息
printf("sendmsg\n");
("hello\0",sizeof("hello\0"));
//关闭socket
printf("close\n");
();
system("pause");
}
四.实验结果
五.心得体会
通过本次实验,我了解了TCP/IP协议与UDP协议的异同之处,理解了Socket在通信中的地位和作用。

在调试程序过程中的查错纠错也让我对程序有了深刻的理解,虽然程序是借鉴他人的,但我通过调试之后的进一步解析阅读也掌握了其中的原理,收获颇丰。

相关文档
最新文档