3-TCPIP协议编程实验(winsocket)

合集下载

通信网络实验 三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,"我是小强我的通网实验做了。

网络编程——windowssocket编程实现TCP通信

网络编程——windowssocket编程实现TCP通信

⽹络编程——windowssocket编程实现TCP通信2.程序服务器程序#include <stdlib.h>#include <stdio.h>#include <WinSock2.h>#pragma comment(lib,"Ws2_32.lib ")int main(){WSADATA wsaData;struct sockaddr_in servAddr;struct sockaddr_in cliAddr;if (WSAStartup(MAKEWORD(2, 2), &wsaData)){printf("Error:RequestWindowsSocketLibrary failed!\n");return0;}/* 设置IP地址 */memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定本机IP//servAddr.sin_addr.s_addr = inet_addr("192.168.1.53");/* 设置端⼝ */servAddr.sin_family = AF_INET;servAddr.sin_port = htons(3000); //端⼝为3000/* 创建套接服务字 */SOCKET serverSocket;serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == INVALID_SOCKET){printf("Error:CreatServerSocket failed!\n");return0;}/* 绑定服务器套接字 */if (bind(serverSocket, (sockaddr*)&servAddr, sizeof(sockaddr)) == SOCKET_ERROR){printf("ERROR:Bind failed!\n");return0;}/* 监听端⼝ */if (listen(serverSocket, 20) == SOCKET_ERROR){closesocket(serverSocket);WSACleanup();printf("ERROR:Listen failed!\n");return0;}printf("linstening:%dport...\n", ntohs(servAddr.sin_port));/* 阻塞⽅式等待accept */int len = sizeof(cliAddr);SOCKET clientSocket;clientSocket = accept(serverSocket, (sockaddr*)&cliAddr, &len);printf("Connected:%s \r\n", inet_ntoa(cliAddr.sin_addr));/* 接受消息 */char recvBuf[100] = { 0 };recv(clientSocket, recvBuf, sizeof(recvBuf), 0);/* 发送消息 */send(clientSocket, recvBuf, 100, NULL);closesocket(clientSocket);WSACleanup();system("pause");return1;}客户端代码#include "stdlib.h"#include <stdio.h>#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dllint main(){//初始化DLL//主版本号(低字节)为2,副版本号为2,返回 0x0202WORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;//WSAStartup() 函数执⾏成功后,会将与 ws2_32.dll 有关的信息写⼊ WSAData 结构体变量//(只需关注前两个成员即可)if (WSAStartup(sockVersion, &wsaData) != 0)return0;//创建套接字,socket() 函数⽤来创建套接字,确定套接字的各种属性//IPv4 地址、⾯向连接的数据传输⽅式、TCP 传输协议SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//向服务器发起请求,将创建的套接字与IP地址 101.76.220.219、端⼝ 3000 绑定:sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr));sockAddr.sin_family = PF_INET;//32位IP地址,s_addr 是⼀个整数(unsigned long),⽽IP地址是⼀个字符串,//所以需要 inet_addr() 函数进⾏转换sockAddr.sin_addr.s_addr = inet_addr("101.76.218.229");//16位的端⼝号,端⼝号需要⽤ htons() 函数转换,0~1023 的端⼝⼀般由系统分配给特定的服务程序, //尽量在 1024~65536 之间分配端⼝号。

网络编程基础深入了解TCPIP协议与Socket编程

网络编程基础深入了解TCPIP协议与Socket编程

网络编程基础深入了解TCPIP协议与Socket编程在当今数字化的时代,网络编程已经成为了每个程序员必备的技能之一。

而要深入了解网络编程,理解TCPIP协议与Socket编程是非常重要的。

TCPIP协议是Internet上应用最广泛的一种网络协议,它是Transmission Control Protocol/Internet Protocol(传输控制协议/互联网协议)的简称。

TCPIP协议是一个由多个协议组成的协议族,在网络编程中负责进行数据的传输和路由。

Socket编程则是一种用于网络编程的编程接口或者调用接口。

通过Socket编程,我们可以实现在不同计算机之间的数据通信。

它提供了一种机制,使得这些数据通信可以像在本地计算机上进行文件读写一样简单。

要深入了解TCPIP协议与Socket编程,首先需要了解TCPIP协议的基本原理与组成。

TCPIP协议一共包含四层:网络接口层、网络层、传输层和应用层。

每一层都有不同的功能和任务。

在网络接口层,主要负责网络硬件设备的操作,包括控制网络适配器和数据线路等。

在网络层,主要负责寻找路由并且传输数据。

传输层则负责确保数据在源和目的之间进行可靠的传输。

最后,在应用层,各种应用程序可以通过不同端口号来进行数据的传输。

Socket编程则是通过创建Socket连接实现网络编程。

在Socket编程中,服务器端和客户端通过创建Socket对象实现数据的传输。

服务器端会监听某个端口号,并且等待客户端的连接请求。

当客户端请求连接时,服务器端会接收该请求并创建新的Socket进行通信。

要深入了解TCPIP协议与Socket编程,还需要了解一些常用的Socket编程的方法和函数。

比如,可以使用bind()函数将Socket与特定的IP地址和端口号进行绑定;使用listen()函数来监听连接请求;使用accept()函数来接收连接请求并创建新的Socket;使用connect()函数来连接服务器端的Socket。

实验三Socket通信实验报告

实验三Socket通信实验报告

实验三Socket 通信实验报告1)实验目的和要求1. 掌握VB、VC++、VS 或JAVA 等集成开发环境编写网络程序的方法;2. 掌握客户/服务器(C/S)应用的工作方式;3. 学习网络中进程之间通信的原理和实现方法;4. 理解单播、组播和广播的原理并比较其不同之处;5. 要求本机既是客户端又是服务器端;2)实验内容所编写的程序应具有如下功能:1. 具有点对点通信功能,任意客户端之间能够发送消息;2. 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3. 具有广播功能,客户端能够向所有其他成员广播消息;3)编程语言和环境1. 编程语言C/C++/C#/Java 等均可;2. 编程环境Windows (MS Visual 系列,VC/VB/ ;)和Linux (编辑器vi+编译器GCC )均可;4)实验主要功能实现说明以下为针对三个实验内容实现方法的简要说明,示例所用语言为C。

基于 C 的面向连接的socket 编程模型1. 点对点通信功能实现网络点对点通讯程序的关键步骤就是实现信息在网络中的发送和接收。

数据接收使用的是Socket,数据发送使用的是NetworkStream 。

1.1 利用Socket 来接收信息TcpListener tlListen1 = new TcpListener ( 8889 ) ;// 侦听端口号tlListen1.Start ( ) ;Socket skSocket = tlListen1.AcceptSocket ( ) ;// 接受远程计算机的连接请求,并获得用以接收数据的Socket 实例EndPoint tempRemoteEP = skSocket.RemoteEndPoint ;// 获得远程计算机对应的网络远程终结点while ( true ){Byte [] byStream = new Byte[80] ;// 定义从远程计算机接收到数据存放的数据缓冲区int i = skSocket.ReceiveFrom ( byStream , ref tempRemoteEP ) ;// 接收数据,并存放到定义的缓冲区中string sMessage = System.Text.Encoding.UTF8.GetString ( byStream ) ;// 以指定的编码,从缓冲区中解析出内容MessageBox.Show ( sMessage ) ;// 显示传送来的数据1.2 利用NetworkStream 来传送信息TcpClient tcpc = new TcpClient ( "10.138.198.213" , 8888 ) ;// 对IP 地址为“10.138.198.213 ”的计算机的8888 端口提出连接申请NetworkStream tcpStream = tcpc.GetStream ( ) ;// 如果连接申请建立,则获得用以传送数据的数据流string sMsg = " 您好,见到您很高兴" ;StreamWriter reqStreamW = new StreamWriter ( tcpStream ) ;// 以特定的编码往向数据流中写入数据, 默认为UTF8 编码reqStreamW.Write ( sMsg ) ;// 将字符串写入数据流中reqStreamW.Flush ( ) ;// 清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流2. 群组通信功能组播编程需要UDP ,有两个类支持组播网络编程Socket 和UdpClient. 一台计算机要加入某一个组,然后接收发往这个组的信息。

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编程有了更深入的了解。

计算机网络实验一_Windows_Socket_编程

计算机网络实验一_Windows_Socket_编程

6
Socket套接字
目标:学习如何建立客户端/服务器应用程序,使用套接字 进行通信
套接字(socket): 应用进程之间的接口,实现端到端的传输
协议
应用层
进程
传输层 网络层 数据链路层 物理层
套接字
Internet
应用层
进程
传输层 网络层 数据链路层 物理层
由应用 开发者 控制
由操作 系统控制
Socket API 类别
PF_INET : 用于互联网编程 PF_UNIX: 用于Unix 管道编程
PF_PACKET:直接访问网络接口 (i.e, 绕过TCP / IP协议栈)
两种基本socket API分别支持两种传输服务:
SOCK_STREAM: 可靠的,字节流服务 (TCP) SOCK_DGRAM: 非可靠的数据报服务 (UDP)
90年代初,由Microsoft联合其他几家公司共同制 定了一套Windows下的网络编程接口,即Windows Socket规范。它是Berkeley Socket的重要扩充,主要 是增加了一些异步函数,并增加了符合Windows消 息驱动特性的网络事件异步选择机制。WinSock规 范是一套开放的、支持多种协议的Windows下的网 络编程接口。从1991年的1.0版到1995年的2.0.8版, 经过不断完善,已成为Windows网络编程的事实上 的标准。
7
WinSock DLL
WinSock与操作系统的关系
应用程序 1
应用程序 2
网络编程接口 ——如 WinSock API 网络通信协议 ——如 TCP/IP协议
操作系统 ——如 Windows 物理通信介质
动态链接库
16位版:WINSOCK.DLL 32位版:W不可靠数据报 可靠的,面向字节流的数据报

计算机网络原理实验三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"从来不显式关闭。

计算机网络一TCPIP协议与Socket编程认识实验

计算机网络一TCPIP协议与Socket编程认识实验

东南大学自动化学院实验报告课程名称:计算机网络实验第 1 次实验实验名称:TCP/IP协议与Socket编程认识实验院(系):自动化专业:自动化姓名:学号:实验室:实验组别:同组人员:实验时间:2012年5月9日评定成绩:审阅教师:一、实验目的和要求:1. 熟悉TCP/IP协议的功能和网络操作;2. 了解MS-DOS环境下基于SOCKET的编程原理;3. 编写一个小型的Socket实用程序,初步了解Windows环境下使用Socket的编程。

二、实验原理:1.Windows Sockets规范:Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。

它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。

Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。

此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。

因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。

遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets 兼容实现的提供者,我们称之为Windows Sockets提供者。

一个网络软件供应商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容。

任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。

Win Socket 编程

Win Socket 编程

实验三Win Socket通信编程一实验目的:1.基本掌握C/C++/VB环境下,实现winsocket的编程操作;2.了解基于对话框的windows应用程序的编写过程;3.对于Windows Socket的编程进行初步的了解。

二实验原理:套接字(Socket)是网络通信的基本构件,最初是由加利福尼亚大学Berkeley学院为UNIX开发的网络通信编程接口,它只能运行在UNIX操作系统,不支持DOS和Windows操作系统。

随着Windows操作系统的日益推广,90年代初,微软和第三方厂商共同制定了一套标准,即Windows Socket规范,简称WinSock。

套接字的概念与文件句柄类似,一个套接字就是一个通信标识,由一个短整数表示,实际上就是一个句柄,代表网络协议中的一组数据,该数据包含了通信双方的IP地址和当前的连接状态等信息。

我们知道,如果一个文件被打开,可以通过文件句柄对文件进行读写操作,套接字也一样,只不过套接字提供的函数更多一些。

2.WinSock的通信机制套接字存在于通信区域中,由协议、地址、端口来描述并在网络中用一个三元组来全局唯一标志一个进程:(协议,本地地址,本地端口号),这样一个三元组叫做一个半相关(half-association),它指定连接的每半部分。

一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。

也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。

因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

根据传输协议的不同,套接字可分为3种类型:流式套接字、数据报套接字和原始套接字。

流式套接字提供了一个面向连接的、可靠的、数据无错且按顺序接收的服务,这种套接字对应的是面向连接的传输协议,如TCP/IP协议簇中的TCP。

windows网络编程(TCP、Ping)实例代码

windows网络编程(TCP、Ping)实例代码

Tcp编程代码//#include <Windows.h>#include <stdio.h>#include <WinSock2.h>#pragma comment(lib,"Ws2_32.lib")#define BUF_SIZE 64void main(){WSADATA wsd;SOCKET sClient;SOCKET sServer;char buf[BUF_SIZE];int retVal;if (WSAStartup(MAKEWORD(2,2),&wsd)){printf("WSAStartup failed!\n");return;}sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){printf("socket failed!\n");WSACleanup();return;}SOCKADDR_IN addrServ;addrServ.sin_family=AF_INET;addrServ.sin_port=htons(4999);addrServ.sin_addr.S_un.S_addr=INADDR_ANY;retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(addrServ));if (retVal==SOCKET_ERROR){printf("bind failed!\n");closesocket(sServer);WSACleanup();return;}retVal=listen(sServer,1);if (SOCKET_ERROR==retVal){printf("listen failed\n");closesocket(sServer);WSACleanup();return;}SOCKADDR_IN adddClient;int addrClentLen=sizeof(adddClient);sClient=accept(sServer,(sockaddr FAR*)&adddClient,&addrClentLen);if (SOCKET_ERROR==sClient){printf("accept failed!\n");closesocket(sServer);WSACleanup();return;}ZeroMemory(buf,56);retVal=recv(sClient,buf,56,0);if (SOCKET_ERROR==retVal){printf("recv failed\n");closesocket(sClient);closesocket(sServer);WSACleanup();return;}printf("%s",buf);closesocket(sServer);closesocket(sClient);WSACleanup();system("pause");}Ping实现代码#include <stdio.h>#include <WS2tcpip.h>#include <WinSock2.h>#include "ping.h"#pragma comment(lib,"Ws2_32.lib")void main(){char szDestip[]="10.15.72.27";SOCKET sRaw=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);SetTimeOut(sRaw,1000,TRUE);SOCKADDR_IN dest;dest.sin_family=AF_INET;dest.sin_port=htons(0);dest.sin_addr.S_un.S_addr=inet_addr(szDestip);char buff[sizeof(ICMP_HDR)+32];ICMP_HDR* pIcmp=(ICMP_HDR*)buff;pIcmp->icmp_type=8;pIcmp->icmp_code=0;pIcmp->icmp_id=(USHORT)::GetCurrentProcessId();pIcmp->icmp_checksum=0;pIcmp->icmp_sequence=0;memset(&buff[sizeof(ICMP_HDR)],'E',32);USHORT nSeq=0;char recvBuf[1024]={0};SOCKADDR_IN from;int nLen=sizeof(from);while(TRUE){static int nCount=0;int nRet;if (nCount++==4){break;}pIcmp->icmp_checksum=0;pIcmp->icmp_timestamp=::GetTickCount();pIcmp->icmp_sequence=nSeq++;pIcmp->icmp_checksum=checksum((USHORT*)buff,sizeof(ICMP_HDR)+32);nRet=::sendto(sRaw,buff,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest)); if (nRet==SOCKET_ERROR){printf("sendto()failed:%d\n",::WSAGetLastError());return;}nRet=::recvfrom(sRaw,recvBuf,1024,0,(sockaddr*)&from,&nLen);if (nRet==SOCKET_ERROR){if (::WSAGetLastError()==WSAETIMEDOUT){printf("time out\n");continue;}printf("recvform()failed:%d\n",::WSAGetLastError());return;}int nTick=::GetTickCount();if (nRet<sizeof(IPHeader)+sizeof(ICMP_HDR)){printf("Too few bytes from%s\n",::inet_ntoa(from.sin_addr));}ICMP_HDR* pRecvIcmp=(ICMP_HDR*)(recvBuf+sizeof(IPHeader));if(pRecvIcmp->icmp_type!=0){printf("nonecho type%d recvd\n",pRecvIcmp->icmp_type);return;}if (pRecvIcmp->icmp_id!=::GetCurrentProcessId()){printf("someone else's packet!");return;}printf("%d bytes from %s:",nRet,inet_ntoa(from.sin_addr));printf("icmp_seq=%d",pRecvIcmp->icmp_sequence);printf("time:%d ms",nTick-pRecvIcmp->icmp_timestamp);printf("\n");::Sleep(1000);}system("pause");}。

03实训项目报告-Windows环境下TCPIP协议的配置

03实训项目报告-Windows环境下TCPIP协议的配置
计算机网络
实训(验)项目报告
教师评语
教师签字日期
成绩
学生姓名
赵文秀
学号
1133101455951
班级
11秋计专
分组
项目编号
03
项目名称
Windows环境下TCP/IP协议的配置
实训报告
一、实训目的
1、掌握IP地址的基础知识。
2、掌握子网掩码的基础知识。
3、掌握TCP/IP通信协议的安装、设置。
二、实训内容与步骤
(ቤተ መጻሕፍቲ ባይዱ求:针对实训案例的每项工作,完成实验,并分别撰写实训步骤)
1.安装TCP/IP协议的主要步骤。
打开本地连接,在“常规”选项栏里选择“Internet协议(TCP/IP)协议”,前面的勾不能去啊,然后点击“安装”,在弹出的“选择网络组件”的对话框里,选择“协议”,然后点击“添加”,然后选择添加Microsoft TCP/IP 6,以上这是安装TCP/IP协议!
五、实训体会
六、思考题
2、配置TCP/IP通信协议,修改IP地址、子网掩码和网关的主要步骤。
网上邻居---右键属性---本地链接属性--tcp/ip协议属性,就可以修改
三、实训成果提交
1.将安装TCP/IP通信协议的过程图复制下来,粘贴到此处。
2.将修改IP地址、子网掩码和网关后的图复制下来,粘贴到此处。
四、实训中遇到的难点及解决办法

WinSocket API —— TCPIP连接

WinSocket API —— TCPIP连接

WinSocket API —— TCP\IP连接要进行网络通信编程,就要用到socket(套接字)。

套接字代表一个通信端口,有地址,有端口号,可连接(按类型),可收,可发。

要进行socket编程,要为工程导入库文件,添加头文件,并在程序里加载套接字库。

#include <winsock2.h>#pragma comment(lib, "ws2_32.lib") //2.0版本#include <winsock.h>#pragma comment(lib, "wsock32.lib") //1.0版本winsock是Windows平台下的网络套接字(Socket)接口规范。

它从Unix平台的Berkele y(BSD)套接字方案借鉴了许多东西。

Winsock是网络编程接口,而不是协议。

建立Winsock2规范的主要目的是提供一个与协议无关的传送接口。

使用winsock API,可以编写基于各种网络协议(如TCP、UDP、IP)的应用程序。

实际上Windows下多数要访问网络的程序其底层都调用了winsock API。

winsock2的winsock API的dll文件是ws2_32.dll。

服务端监听过程:1. 加载套接字库,主要是版本,注意拼接次序。

WSADATA{ wVersion,wHighVersion, iMaxSockets\iMaxUdpDg };0 ==WSAStartup(MAKEWORD(1,2), &WSADATA) ; //载入WinSocket API dll 库w = MAKEWORD(a, b); a = LOBYTE(w); b = HIBYTE(w); //版本2.1,makeword(1,2)l = MAKELONG(a, b); a = LOWORD(l); b = HIWORD(w);2. 创建一个服务器端socket,这是一个监听套接字INVALID_SOCKET(socket类)!= socket(AF_INET\UNIX\…,SOCK_STREAM\DGRAM\…, 0);//通信端点3. 创建一个地址结构体,用bind函数把socket和地址绑定,只有服务器端监听套接字需要绑定:SOCKADDR_IN{ sin_family, //指定地址家族sin_port = htons(short),sin_addr.s_addr = htonl(INADDR_ANY)= inet_addr("172.29.1.1")}//inet_ntoa(long)SOCKET_ERROR(-1)!= bind(m_Socket, (structsockaddr *)&SOCKADDR_IN, sizeof());4. 设置为监听模式:listen(m_Socket, SOMAXCONN); //放入等待连接队列,超出的直接丢弃5. 等待客户端的连接请求:real_conn_Socket = accept (m_Socket, (SOCKADDR*) &SOCKADDR_IN,&len);//real_conn_Socket◆当有客户端请求连接m_Socket,accept 函数就会执行。

实验三 Windows网络配置和TCPIP协议配置及诊断

实验三 Windows网络配置和TCPIP协议配置及诊断

实验三Windows网络配置和TCP/IP协议配置及诊断一、实验目的学习在Windows系统中进行IP地址、网络掩码、DNS服务器等网络协议配置,进一步掌握用ping、ipconfig、tracert等命令工具来进行网络测试和查看网络状态。

本实验在于更好地理解计算机网络设置的基本操作,掌握计算机网络配置的基本监测技术。

二、实验内容Windows的网络配置、Windows TCP/IP 协议配置三、实验环境Windows 2000 操作系统四、实验步骤4.1 Windows的网络配置1、进入网络配置单击“开始”按钮,打开“开始”菜单,依次选择“设置”和“控制面板”,打开“控制面板”对话框。

双击“网络”图标就直接进入“网络”对话框,如图-1所示。

在对话框中,一般包括“配置”、“标识”和“访问控制”在内的三个标签选项,当用户计算机尚未配置任何网络组件时,则仅显示“配置”一个标签选项。

其中,“配置”标签用于添加和删除各种网络组件及配置已有网络组件的各种属性;“标识”标签选项用于赋予或修改用户计算机的名称包括计算机名、工作组和计算机说明等描述特性;“访问控制”标签选项用于设定共享资源的访问权限。

网络的配置工作就是在“配置”标签里完成的。

配置标签里列出了已安装了的网络组件清单。

这些组件可分成以下四类:客户端、适配卡、通信协议和服务。

其中,“客户端”是网络客户机软件,它使用户的计算机可以访问网络中其他服务器提供的共享资源;“适配卡”即网络接口卡;“协议”指网络通信协议;“服务”组件使用户的计算机可以扮演服务器的角色,可以向网络中的其他计算机提供共享资源。

图-12、添加客户组件并设定属性在“配置”标签中单击“添加”按钮,选择“客户”组件类型,然后单击“确定”,或双击“客户”组件类型即可进入如图-2所示的“选定网络客户”对话框。

对话框的左边是网络厂商,右边是由厂商提供的网络客户组件,选择所需按确定即可。

在网络组件列表中单击相应的客户组件,单击“属性”命令按钮,即可激活相应的“网络客户特性”对话框,该对话框有两个活页卡片可选择:“高级”和“通用”,可根据需要选择或输入设定的内容。

WinSocket编程实验报告

WinSocket编程实验报告

WinSocket编程实验报告实验六:winsock编程实验报告1实验目的和要求1)自学网络中进程之间通信的原理和同时实现方法;2)掌握在vb或vc++等集成开发环境中编写网络程序的方法;3)撰写一个直观的聊天程序:最高建议同时实现两人一组的两台计算机之间的通话文本及其表明;2实验设备及分组1)windows2000以上操作系统;2)vb和visualc++6.0语言环境;3)每人一台pc 机。

3实验内容和步骤3.1设计服务器界面图3-1服务器界面3.2设计客户端界面先建立一个工程,取名为client。

在窗体中加入控件:将winsock控件添加到窗体里,名称属性改为winsockclient。

建立两个richtextbox,richtextbox1的名称属性改为textget,scrollbars属性改为3-rtfboth,locked属性改为true,richtextbox2的名称属性改成textsend,scrollbars属性改成3-rtfboth。

在窗体里图3-2客户端界面3.3编写程序及其表明3.3.1服务器程序winsockserver.senddata\textget.text=textget.text&a&\vbcrlf‘可以自动下划线,并存有时间表明textsend.text=\‘发送完毕后,文本框自动清空endsubprivatesubform_load()‘窗体读取时,传送文本框与发送文本框不可知textsend.visible=false‘发送信息文本框不可知textget.visib le=false‘发送信息文本框可知winsockserver.localport=1001‘服务器端口号设置winsockserver.listen‘服务器侦听endsubprivatesubwinsockserver_close()winsockserver.close‘停用服务器endsubprivatesubwinsockserver_connectionrequest(byvalrequestidaslong)‘连接后,winsock控件工作textsend.visible=truetextsend.text=\‘清空文本框信息textget.visible=truetextget.text=\ifwinsockserver.state<>sckclosedthenwinsockserver.close‘如果socket没有关闭,则关闭socketwinsockserver.acceptrequestid‘服务器拒绝接受命令,拒绝接受以后双方就可以发送数据msgbox(\连接server成功!\endsubprivate subwinsockserver_dataarrival(byvalbytestotalaslong)‘信息发送dimtmpstrasstringdimaasstringa=\客户端:\winsockserver.getdatatmpstrtextget.text=textget.text&a&tmpstr&vbcrlfendsub3.3.2客户端程序aa=\客户端:\winsockclient.senddata\textget.text=textget.text&aa&\vbcrlftextsend.text=\endsubprivatesubform_load()‘程序读取,文本框不可知text1.text=\这里输入要连接的服务器的ip\‘提示输入ip地址textsend.visible=falsetextget.visible=falsewinsockclient.remoteport=1001’客户端端口号设置为1001winsockclient.remotehost=\endsubprivatesubtext1_change()winsockclient.remotehost=text1.text‘客户端检验主机名endsubprivatesubwinsockclient_close()‘关闭客户端winsockclient.closeendsubprivatesubwinsockclient_connect()‘客户端相连接textsend.visible=truetextsend.text=\textget.visible=truetextget.text=\privatesubwinsockclient_connectionrequest(byvalrequestidaslong)textsend.visible=truetextsend.text=\textget.visible=truetextget.text=\ifwinsockserver.state<>sckclosedthenwinsockserver.close‘如果socket没停用,则停用socketwinsockserver.acceptrequestidendsubprivatesubwinsockclient_dataarrival(byvalbytestotalaslong)‘信息发送dimtmpstrasstringdimaasstringa=\服务器:\winsockclient.getdatatmpstrtextget.text=textget.text&a&tmpstr&vbcrlfendsub3.4运行程序3.4.1客户端运行结果图3-3客户端相连接运行后,填写要连接的主机的ip地址,点击连接,成功后,会提示连接服务器成功。

实验三 基于TCP和UDP的Socket 编程(2)

实验三 基于TCP和UDP的Socket 编程(2)

实验三基于TCP和UDP的SOCKET 编程实验时间:第12、13、14周(6课时)第二部分(2课时):基于UDP的SOCKET 编程一、预习要求:(1)TCP服务(2)UDP服务(3)SOCKET套接字二、实验目的:(1)掌握TCP传输中服务端和客户端程序的设计(2)掌握TCP传输中服务端和客户端程序的设计(3)掌握SOCKET套接字的应用三、实验环境:VC++6.0四、实验内容:预备知识:1、套接字(socket)1)为了能方便的开发网络应用软件,由美国伯克利大学在UNIX上推出了一种应用程序访问通信协议的操作系统调用套接字(socket)。

2)Socket的出现,使程序员可以很方便的访问TCP/IP,从而开发了各种网络应用程序。

3)随着UNIX的应用推广,套接字在编写网络软件中得到了普及,后来套接字又被引进了WINDOWS等操作系统,成为开发网络应用程序的非常有效快捷的工具。

2、套接字类型1)流式套接字(SOCK_STREAM),提供面向连接、可靠的数据传输服务,数据无差错、无重复发送,且按发送顺序接收(TCP服务)。

2)数据报式套接字(SOCK_DGRAM)提供无连接服务。

数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接受顺序混乱(UDP服务)。

3)原始套接字(SOCK_RAW)3、主要相关函数int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);MAKEWORD();int bind( SOCKET s, const struct sockaddr FAR *name, int namelen);int listen( SOCKET s, int backlog );SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);int sendto( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen );int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen );int connect( SOCKET s, const struct sockaddr FAR *name, int namelen );int closesocket( SOCKET s );int WSACleanup (void);任务一:创建UDP服务的服务端实验步骤:1)创建一个Win32 Console Application工程(Project),创建一个源文件(C++ Source File),命名为UdpSrv。

tcpip协议编程

tcpip协议编程

竭诚为您提供优质文档/双击可除tcpip协议编程篇一:tcpip协议编程tcp/ip协议编程1.1实验目的:1、掌握基于tcp/ip协议进行远程通讯的原理2、掌握sockets网络程序设计的原理和方法3、理解面向连接服务、面向无连接的特点1.2实验任务1学会winsock网络编程基础2winsock控件的属性和方法1.3实验环境windows98或windows2000操作系统,编译环境任选。

1.4实验方法一、实验原理(一)tcp/ip的特点和sockettcp/ip是网络上广泛应用的协议,其中ip是网络层的协议,它是无连接的;tcp是传输层的协议,它是面向连接的。

在实际系统中,tcp/ip通常在操作系统内核中实现,用户所能感受到的和可以用来进行网络程序开发的是操作系统提供的网络编程界面。

在tcp/ip网络环境下,网络编程界面称为套接字(socket)(见图1)。

图1、tcp/ip协议核心与应用程序关系图图1中的应用程序1和2可以是位于不同主机上的2个进程,他们的作用方式是客户/服务器模式。

1、sockets编程原理(1)sockets编程中的主要概念●协议、地址、端口:在sockets编程中,传输层的协议既可以是tcp,也可以是udp。

sockets是用于网间进程通讯的,因此在标识上要进行网间进程标识。

地址是标识主机的,在sockets编程中通常指ip地址;而端口标识通信的进程,它可以是1-65535间的任何一个数字,其中1-255保留给特定的服务、256-1023保留给其它的一般服务(如路由函数)、1024-4999可以被任意的客户机端口使用、5000-65535可以被任意的服务器端口使用。

地址+端口就实现了网间进程标识。

(协议、本地地址、本地端口号、远程地址、远程端口号)是一组五元相关。

●面向连结、无连接、socket类型:传输层中的tcp协议是面向连接的,udp协议是无连接的,因此socket主要有两种类型:流套接字用于tcp/ip编程,提供面向连接的服务;数据报套接字用于udp/ip编程,提供无连接的服务。

Windows下C语言的Socket编程例子(TCP和UDP)

Windows下C语言的Socket编程例子(TCP和UDP)

Windows下C语⾔的Socket编程例⼦(TCP和UDP)⼀。

<TCP>server端:1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib,"ws2_32.lib")67int main(int argc, char* argv[])8 {9//初始化WSA10 WORD sockVersion = MAKEWORD(2,2);11 WSADATA wsaData;12if(WSAStartup(sockVersion, &wsaData)!=0)13 {14return0;15 }1617//创建套接字18 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);19if(slisten == INVALID_SOCKET)20 {21 printf("socket error !");22return0;23 }2425//绑定IP和端⼝26 sockaddr_in sin;27 sin.sin_family = AF_INET;28 sin.sin_port = htons(8888);29 sin.sin_addr.S_un.S_addr = INADDR_ANY;30if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)31 {32 printf("bind error !");33 }3435//开始监听36if(listen(slisten, 5) == SOCKET_ERROR)37 {38 printf("listen error !");39return0;40 }4142//循环接收数据43 SOCKET sClient;44 sockaddr_in remoteAddr;45int nAddrlen = sizeof(remoteAddr);46char revData[255];47while (true)48 {49 printf("等待连接...\n");50 sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);51if(sClient == INVALID_SOCKET)52 {53 printf("accept error !");54continue;55 }56 printf("接受到⼀个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));5758//接收数据59int ret = recv(sClient, revData, 255, 0);60if(ret > 0)61 {62 revData[ret] = 0x00;63 printf(revData);64 }6566//发送数据67char * sendData = "你好,TCP客户端!\n";68 send(sClient, sendData, strlen(sendData), 0);69 closesocket(sClient);70 }7172 closesocket(slisten);73 WSACleanup();74return0;75 }client端:1 #include "stdafx.h"2 #include <WINSOCK2.H>3 #include <STDIO.H>45#pragma comment(lib,"ws2_32.lib")678int main(int argc, char* argv[])9 {10 WORD sockVersion = MAKEWORD(2,2);11 WSADATA data;12if(WSAStartup(sockVersion, &data) != 0)13 {14return0;15 }1617 SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);18if(sclient == INVALID_SOCKET)19 {20 printf("invalid socket !");21return0;22 }2324 sockaddr_in serAddr;25 serAddr.sin_family = AF_INET;26 serAddr.sin_port = htons(8888);27 serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");28if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)29 {30 printf("connect error !");31 closesocket(sclient);32return0;33 }34char * sendData = "你好,TCP服务端,我是客户端!\n";35 send(sclient, sendData, strlen(sendData), 0);3637char recData[255];38int ret = recv(sclient, recData, 255, 0);39if(ret > 0)40 {41 recData[ret] = 0x00;42 printf(recData);43 }44 closesocket(sclient);45 WSACleanup();46return0;47 }⼆. <UDP>SERVER 端1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib, "ws2_32.lib")67int main(int argc, char* argv[])8 {9 WSADATA wsaData;10 WORD sockVersion = MAKEWORD(2,2);11if(WSAStartup(sockVersion, &wsaData) != 0)12 {13return0;14 }1516 SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);17if(serSocket == INVALID_SOCKET)18 {19 printf("socket error !");20return0;21 }2223 sockaddr_in serAddr;24 serAddr.sin_family = AF_INET;25 serAddr.sin_port = htons(8888);26 serAddr.sin_addr.S_un.S_addr = INADDR_ANY;27if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)28 {29 printf("bind error !");30 closesocket(serSocket);31return0;32 }3334 sockaddr_in remoteAddr;35int nAddrLen = sizeof(remoteAddr);36while (true)37 {38char recvData[255];39int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);40if (ret > 0)41 {42 recvData[ret] = 0x00;43 printf("接受到⼀个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));44 printf(recvData);45 }4647char * sendData = "⼀个来⾃服务端的UDP数据包\n";48 sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen); 4950 }51 closesocket(serSocket);52 WSACleanup();53return0;54 }CLIENT 端1 #include "stdafx.h"2 #include <stdio.h>3 #include <winsock2.h>45#pragma comment(lib, "ws2_32.lib")67int main(int argc, char* argv[])8 {9 WORD socketVersion = MAKEWORD(2,2);10 WSADATA wsaData;11if(WSAStartup(socketVersion, &wsaData) != 0)12 {13return0;14 }15 SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);1617 sockaddr_in sin;18 sin.sin_family = AF_INET;19 sin.sin_port = htons(8888);20 sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");21int len = sizeof(sin);2223char * sendData = "来⾃客户端的数据包.\n";24 sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);2526char recvData[255];27int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);28if(ret > 0)29 {30 recvData[ret] = 0x00;31 printf(recvData);32 }3334 closesocket(sclient);35 WSACleanup();36return0;37 }本⽂来⾄:。

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

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

计算机网络实验报告专业:计算机科学与技术年级:班级:姓名:学号:计算机科学学院TCP协议分析1、What is the IP address and TCP port number used by the client computer (source) that is transferring the file to ? To answer this question, i t‟s probably easiest to select an HTTP message and explore the details of the TCP packet used to carry this HTTP message, using the “details of the selected packet header window” (refer to Figure 2 in the “Getting Started with Wireshark” Lab if you‟re uncertain about the Wireshark windows).2、What is the IP address of ? On what port number is it sending and receiving TCP segments for this connection?S:R:4、What is the sequence number of the TCP SYN segment that is used to initiate the TCP connection between the client computer and ? What is itin the segment that identifies the segment as a SYN segment?5、What is the sequence number of the SYNACK segment sent by to the client computer in reply to the SYN? What is the value of the ACKnowledgement field in the SYNACK segment? How did determine that value? What is it in the segment that identifies the segment as a SYNACK segment?SYNACK = ACK + Len6、What is the sequence number of the TCP segment containing the HTTP POST command? Note that in order to find the POST command, you‟ll need to dig into the packet content field at the bottom of the Wireshark window, looking for a segment with a “POST” within its DATA field.7、Consider the TCP segment containing the HTTP POST as the first segment in the TCP connection. What are the sequence numbers of the first six segments in the TCP connection (including the segment containing the HTTP POST)? At what time was each segment sent? When was the ACK for each segment received? Given the difference between when each TCP segment was sent, and when its acknowledgement was received, what is the RTT value for each of the six segments? What is the EstimatedRTT value (see page 249 in text) after thereceipt of each ACK? Assume that the value of the EstimatedRTT is equal tothe measured RTT for the first segment, and then is computed using the EstimatedRTT equation on page 249 for all subsequent segments.8、What is the length of each of the first six TCP segments?ERTT …= 0.875*ERTT + 0.125*SRTT;9、What is the minimum amount of available buffer space advertised at the receivfor the entire trace? Does the lack of receiver buffer space ever throttle the sender?NO!10、Are there any retransmitted segments in the trace file? What did you check for (in the trace) in order to answer this question?NO ! Because every sequence number of ACK are different.11、How much data does the receiver typically acknowledge in an ACK? Can you identify cases where the receiver is ACKing every other received segment (seeTable 3.2 on page 257 in the text).12、What is the throughput (bytes transferred per unit time) for the TCP connection? Explain how you calculated this value.13、Use the Time-Sequence-Graph(Stevens) plotting tool to view the sequence number versus time plot of segments being sent from the client to the server. Can you identify where TCP‟s slowstart phase beginsand ends, and where congestion avoidance takes over? Comment on ways inwhich the measured data differs from the idealized behavior of TCP that we‟ve studied in the text.。

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

第三节TCP/IP协议编程实验
|━Windows环境下基于TCP/IP的信息传送程序设计
1.1实验目的:
1、掌握基于TCP/IP协议进行远程通讯的原理
2、掌握Sockets网络程序设计的原理和方法
3、理解面向连接服务、面向无连接的特点
1.2 实验任务
1 学会Winsock 网络编程基础
2 Winsock控件的属性和方法
1.3 实验环境
Windows98 或Windows2000 操作系统,编译环境任选。

1.4 实验方法
一、实验原理
(一)TCP/IP的特点和Socket
TCP/IP是网络上广泛应用的协议,其中IP是网络层的协议,它是无连接的;TCP是传输层的协议,它是面向连接的。

在实际系统中,TCP/IP通常在操作系统内核中实现,用户所能感受到的和可以用来进行网络程序开发的是操作系统提供的网络编程界面。

在TCP/IP 网络环境下,网络编程界面称为套接字(Socket)(见图1)。

图1、TCP/IP协议核心与应用程序关系图
图1中的应用程序1和2可以是位于不同主机上的2个进程,他们的作用方式是客户/服务器模式。

1、Sockets编程原理
(1)Sockets编程中的主要概念
●协议、地址、端口:
在Sockets编程中,传输层的协议既可以是TCP,也可以是UDP。

Sockets是用于网间进程通讯的,因此在标识上要进行网间进程标识。

地址是标识主机的,在Sockets编程中通常指IP地址;而端口标识通信的进程,它可以是1-65535间的任何一个数字,其中1-255保留给特定的服务、256-1023保留给其它的一般服务(如路由函数)、
1024-4999可以被任意的客户机端口使用、5000-65535可以被任意的服务器端口使用。

地址+端口就实现了网间进程标识。

(协议、本地地址、本地端口号、远程地址、远程端口号)是一组五元相关。

●面向连结、无连接、Socket类型:
传输层中的TCP协议是面向连接的,UDP协议是无连接的,因此Socket主要有两种类型:流套接字用于TCP/IP编程,提供面向连接的服务;数据报套接字用于UDP/IP编程,提供无连接的服务。

●网络字节顺序:
不同的计算机存放多字节值的顺序不同,为保证数据的正确性,在网络协议中必须指定网络字节顺序。

TCP/IP协议使用16位整数和32位整数的高位先存格式。

在编程中,调用htons()和htonl()函数来转换端口(短整型数值)和地址(长整型数值)参数的字节顺序(2)Sockets编程原理
●创建套接字:用socket()来创建套接字。

●指定本地地址:用bind()来指定本地地址。

●侦听连接:面向连接的服务中,服务器套接字在socket()和bind()后,就要调用listen()来侦听客户机的请求。

●建立套接字连接:面向连接的服务中,客户机在socket()和bind()之后,要调用connect()来向服务器请求连接,服务器在侦听到客户机的请求后,要调用accept()来接受连接。

●数据传输:当一个连接建立以后,就可以传输数据了。

在传输数据时,用到send()和recv()。

●输入/输出多路复用:用select()函数指定你想等待数据的套接字,当数据被套接字接收到以后,select()返回,并确定在输入队列中哪个套接字在等待数据,然后,就可以接收数据。

●关闭套接字:用closesocket()函数关闭套接字,并释放分配给该套接字的资源。

2、使用已封装好的类进行Windows Sockets编程
以上所提到的WinSock编程的方法和函数是标准Sockets调用和WinSock API所提供的,在Windows环境下使用任何编程语言、开发环境都可以实现。

现在,很多开发环境都提供了已经封装好的用于Windows Sockets编程的类,这些现成的类使得WinSock的程序开发更方便、快速。

图2演示了面向连接的流套接字的工作过程;图3演示了无连接的数据报。

二实验步骤
使用TCP/IP协议编写一个聊天程序。

(参见演示例子)
演示例子:
本例使用UDP协议建立一个“聊天”程序。

所谓“聊天”是指两个程序能够发送数据给对方,在此两个程序之间是平等的、处于同一地位,没有服务器和客户的区别。

另外,UDP程序不需建立显式的连接,所以在程序编写上比使用TCP方式简单。

建立“聊天A”程序的步骤如下:
(1)打开Visual Basic6.0中文版,创建标准工程。

在工具箱上单击右键,在弹出的菜单中选择“部件”菜单项,在弹出的“部件”对话框中,选中“Miscrosoft Windows Common Controls 6.0”和”Microsoft winsock Control 6.0”两个复选框。

单击“确定”按钮,所选择的控件出现在工具箱中,然后建立标准程序,并设置窗体标题为“聊天A”。

(2)把Winsock控件拖放到窗体中,并设置Protocol属性为1-sckUDPProtocol,其他属性为缺省值。

(3)在窗体上放置两个标签和文本框,设置两个标签的Caption属性分别为“接收窗”
和“发送窗”。

下面编写代码:
(1)在Form-Load过程中设置网络地址,这里要设置LocalPort,RemoteHost和RemotePort 属性。

为保证信息能够传送到相应程序,而按下面规则设置属性:“聊天A”的RemoteHost设置为运行“聊天B”程序的主机地址。

“聊天A”的RemotePort设置要与“聊天B”的LocalPort属性一致。

服务器的RemoteHost设置为客户程序的主机地址。

服务器的RemotePort设置要与客户LocalPort属性一致。

只有这样设置,两个程序间才能正常通信,这部分代码如下:
Private Sub Form-Load()
*设置双方网络地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost=“202.99.6.101”
Winsock1.RemotePort=1997
End Sub
(2) 在文本框中Change事件中,发送用户输入的数据.
Private Sub Text1-Change ( )
*发送用户输入的内容
Winsock1.SendDate Text1.Text
End Sub
(3) 有数据到达时,显示对方的数据内容
Private Sub Winsock1-DataArrival (ByVal bytesTotal As Long)
Dim rec As String
*接收对方数据并在文本框内显示
Winsock1.GetData rec, vbstring
Text2.Text = rec
End Sub
到这里已经完成”聊天A”程序设计,保存并将其编译成执行文件.
接下来设计“聊天B”程序。

由于A,B是平等的,因此处理方式及流程一样,只需按上述原则在Form-Load中设置好其网络地址,其他部分则完全一样。

下面是“聊天B”程序的Form-Load过程代码。

Private Sub Form-Load()
*设置双方网络地址
Winsock1.LocalPort=1997
Winsock1.RemoteHost=“202.99.6.101”
Winsock1.RemotePort=1024
End Sub
完成“聊天B”的设计,将其存盘并编译。

现在可使用这两个程序进行对话了。

接下来,由同学们自己编写以下的程序,可以参照QQ的界面开发更多的功能。

1、一个人同时与多个人聊天。

2、多个人一起聊天
1.5参考材料:
1、Windows Sockets 规范及应用——Windows网络编程接口
(WsBook_ChineseEdtion.DOC);
2、Winsock和所用的编译环境的帮助文件;
3、任何涉及Windows网络编程的书。

相关文档
最新文档