TCPUDP客户服务器实验报告
TCP和UDP客户端及服务器端实验报告

TCP和UDP客户端及服务器端实验报告一、原理1.基于TCP协议的服务器端程序流程:1)创建套接字(socket)2)绑定套接字(bind)3)将套接字设为监听,准备接收客户请求(listen)4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)5)用返回的套接字与客户端进行通信(send/recv)6)返回,等待另一客户请求7)关闭套接字2.基于TCP协议的客户端程序流程1)创建套接字(socket)2)向服务器发出连接请求(connect)3)和服务器端进行通信(send/recv)4)关闭套接字在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。
3.基于UDP的服务器端编写1)创建套接字(socket)2)绑定(bind)3)等待接收数据(recvfrom)4)关闭套接字4.基于UDP的客户端编写1)创建套接字(socket)2)向服务器发送数据(sendto)3)关闭套接字在所有的套接字编程中第一步都是加载套接字库(WSAStartup)对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。
TCP代码实现:首先要建两个工程,不妨设为tcpsrv和tcpclient,分别为客户端和服务器端tcpsrv.cpp//TCP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(){SOCKET serversoc;SOCKET clientsoc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((serversoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if(bind(serversoc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Bind fail!\n");return -1;}//start listen, maximum length of the queue of pending connections is 1printf("Start listen...\n");if(listen(serversoc, 1) != 0){printf("Listen fail!\n");return -1;}len = sizeof(SOCKADDR_IN);//waiting for connectingif((clientsoc = accept(serversoc, (SOCKADDR *)&clientaddr, &len))<=0) {printf("Accept fail!\n");return -1;}printf("Connected\n");while(1){//waiting for data receiveif(recv(clientsoc, buf, BUFLEN, 0) <= 0){//some error occurprintf("Close connection\n");closesocket(clientsoc);break;}printf("%s\n",buf);}WSACleanup(); //clean up Ws2_32.dllreturn 0;}相应的客户端程序,tcpclient.cpp//TCP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(){SOCKET soc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;unsigned char buf[1024];WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//connect to serverprintf("Try to connect...\n");if(connect(soc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Connect fail!\n");return -1;}printf("Connected\n");while(1){scanf("%s", buf);//send to serverif(send(soc, buf, strlen(buf)+1, 0)<=0){printf("Error!\n");}}WSACleanup(); //clean up Ws2_32.dllreturn 0;}UDP服务器端://UDP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a process memset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_port = htons(9102);addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(soc,(struct sockaddr *)&addr,sizeof(struct sockaddr))!=0){printf("Bind fail!\n");return -1;}len = sizeof(addr);printf("start listen...\n");while(1) {recvfrom(soc, buf, BUFLEN, 0,(struct sockaddr*)&addr, &len);printf("%s\n",buf);}WSACleanup(); //关闭return 0;}客户端://UDP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;unsigned char buf[BUFLEN];WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);//initial Ws2_32.dll by a processmemset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(9102);bind(soc,(struct sockaddr *)&addr,sizeof(addr));while(1) {scanf("%s", buf);sendto(soc, buf, strlen(buf)+1, 0, (struct sockaddr *)&addr, sizeof(addr));}WSACleanup();//clean up Ws2_32.dllreturn 0;}。
简单的服务器客户端程序实验报告

简单的客户/服务器程序设计与实现实验目的及要求:1、熟悉Microsoft Visual Studio 2008编程环境;2、了解TCP 与UDP 协议,以及它们之间的区别;3、了解客户/服务器模型原理;4、熟悉Socket 编程原理,掌握简单的套接字编程;实验设备:硬件:PC 机两台以上、网卡、已经设定好的以太网环境软件:Microsoft Visual Studio 2008实验内容及步骤:1、编写用TCP 协议实现的Client 端和Server 端程序并调试通过;程序分两部分:客户程序和服务器程序;工作过程是: 服务器首先启动,它创建套接字之后等待客户的连接;客户启动后创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来;或者服务器接收键盘输入,然后将数据发送到客户机,客户机收到数据后,将接收到的字符在屏幕上显示出来;3、编写用TCP 协议实现Client 端与Server 端的一段对话程序;Server 端根据用户的输入来提示Client 端下一步将要进行操作;所用函数及结构体参考:1、创建套接字——socket功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socketint af, int type, int procotol;参数:af:代表网络地址族,目前只有一种取值是有效的,即AF_INET,代表internet 地址族;Type:代表网络协议类型,SOCK_DGRAM代表UDP协议,SOCK_STREAM代表TCP 协议;Protocol:指定网络地址族的特殊协议,目前无用,赋值0即可;返回值为SOCKET,若返回INVALID_SOCKET则失败;2、指定本地地址——bind功能:将套接字地址与所创建的套接字号联系起来;格式:int PASCAL FAR bindSOCKET s, const struct sockaddr FAR name, int namelen;参数:s: 是由socket调用返回的并且未作连接的套接字描述符套接字号;其它:没有错误,bind返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_in{short sin_family;Please connect...\n\n\n";sin_size = sizeofstruct sockaddr_in;ifsock2=acceptsock1,struct sockaddr &their_addr,&sin_size==-1{perror"Accepting stream socket";exit1;}printf" Accepting a new connet:%s",inet_ntoa;}.";sin_size = sizeofstruct sockaddr_in;ifsock2=::connectsock1,LPSOCKADDR&my_addr,sin_size= =-1{perror"Accepting stream socket";exit1;}}//选择菜单int menu{char s=charmalloc2sizeofchar;int c;printf"\n\n\n Client: Menu\n\n\n";printf" \n\n";printf"Message \n";printf" Message \n";printf" \n\n";printf" \n";do{printf"\n Enter your choice:";getss;ifs0=='\0'{getss;}c=atois;}whilec<0||c>3;frees;return c;}//消息发送函数void Send{char Msg10240;printf"\nPlease Input the message:";getsMsg;Msg10239='\0';::sendsock1,Msg,strlenMsg,0;}//消息接收函数void Receive{int len;char buf10240;forint i=0;i<10240;i++{bufi='\0';}iflen=::recvsock1,buf,10240,0==-1{perror"Receving data error";exit1;}printf"The Received Message:%s\n",buf; }//主函数void main{Init;for;;{switchmenu{case 1:Send;break;case 2:Receive;break;case 3:exit0;}}::closesocketsock2;::closesocketsock1;::WSACleanup;}Client端界面:实验结果及心得:实验结果截图:客户端向服务端发送信息:客户端接收服务端消息:服务端接收消息:实验心得:通过本次实验及课上老师讲解,了解了TCP与UDP协议和它们之间的区别,以及客户/服务器模型的原理;通过C/S代码的编写运行,形象地看到客户/服务器端的运作方式,对于C/S模型有了很深刻的印象以及进一步理解;通过代码的编写,再一次熟悉Socket编程原理,掌握简单的套接字编程;第一次运行程序成功后,是在同一台电脑上进行C与S端的连接;在课上实验,将程序放在 2台台式机上进行运行,在与同学探讨中又将代码中有关部分,比如IP 地址等进行了修改,最终使程序在2台电脑上运行成功;。
主要协议分析实验报告(3篇)

第1篇一、实验背景随着计算机网络技术的飞速发展,网络协议作为计算机网络通信的基础,扮演着至关重要的角色。
为了更好地理解网络协议的工作原理和功能,我们开展了主要协议分析实验。
本实验旨在通过分析常用网络协议的报文格式和工作机制,加深对网络协议的理解。
二、实验目的1. 熟悉常用网络协议的报文格式和工作机制。
2. 掌握网络协议分析工具的使用方法。
3. 培养网络故障排查和问题解决能力。
三、实验环境1. 实验设备:PC机、网线、Wireshark软件。
2. 实验网络:局域网环境,包括路由器、交换机、PC等设备。
四、实验内容本实验主要分析以下协议:1. IP协议2. TCP协议3. UDP协议4. HTTP协议5. FTP协议五、实验步骤1. IP协议分析(1)启动Wireshark软件,选择合适的抓包接口。
(2)观察并分析IP数据报的报文格式,包括版本、头部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址、目的IP地址等字段。
(3)分析IP分片和重组过程,观察TTL值的变化。
2. TCP协议分析(1)观察TCP数据报的报文格式,包括源端口号、目的端口号、序号、确认号、数据偏移、标志、窗口、校验和、紧急指针等字段。
(2)分析TCP连接建立、数据传输、连接终止的过程。
(3)观察TCP的重传机制和流量控制机制。
3. UDP协议分析(1)观察UDP数据报的报文格式,包括源端口号、目的端口号、长度、校验和等字段。
(2)分析UDP的无连接特性,观察UDP报文的传输过程。
4. HTTP协议分析(1)观察HTTP请求报文和响应报文的格式,包括请求行、头部字段、实体等。
(2)分析HTTP协议的请求方法、状态码、缓存控制等特性。
(3)观察HTTPS协议的加密传输过程。
5. FTP协议分析(1)观察FTP数据报的报文格式,包括命令、响应等。
(2)分析FTP的文件传输过程,包括数据传输模式和端口映射。
UDP及TCP通信程序的设计与实现实验报告

实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013 年 5 月30 日目录实验目的和内容 (1)实验目的 (1)实验内容 (1)实验环境 (2)程序的逻辑框图 (2)UDP通信程序的逻辑框图: (2)TCP通信程序的逻辑框图: (3)程序源代码(数据结构的描述、核心算法) (4)1.TCP通信程序源代码 (4)2.TCP通信程序数据结构的描述 (7)3.TCP通信程序的核心算法 (7)4.UDP通信程序源代码 (8)5.UDP通信程序数据结构的描述 (11)6.UDP通信程序的核心算法 (12)实验数据、结果分析 (13)TCP通信程序实验结果分析 (13)UDP通信程序实验结果分析 (14)总结 (16)实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。
实验内容1.实现控制台模式下,在单机上基于UDP的聊天程序;2.实现控制台模式下,在单机上基于TCP的聊天程序;3.上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。
实验环境在win7系统下,visual studio 2008环境下的win32平台下程序的逻辑框图UDP通信程序的逻辑框图:Server端:Client端:TCP通信程序的逻辑框图:Server端:程序源代码(数据结构的描述、核心算法)1.TCP通信程序源代码Client端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){char rbuf[256];char szText[256];InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//判断socket是否创建成功if(sListen == INVALID_SOCKET){printf("Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in sin;sin.sin_family = AF_INET; //IP协议sin.sin_port = htons(4567); //端口号sin.sin_addr.S_un.S_addr = INADDR_ANY; //接收任何IP的连接//绑定函数,将socket 与IP地址和端口绑定在一块if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("Failed bind() \n");return 0;}//开始监听,第二个参数表示最大连接数if(listen(sListen, 2) == SOCKET_ERROR){printf("Failed listen() \n");return 0;}//定义一个新的变量sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);//用于存储连接客户端的socketSOCKET sClient;//accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP 和端口号存在remoteAddr中sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);printf("接收到一个连接%s \r\n", inet_ntoa(remoteAddr.sin_addr));while(TRUE){if(sClient == INVALID_SOCKET){printf("Failed accept()");continue;}printf("send:");scanf("%s",szText);//发送函数,往sClient这个socket中发送szTextsend(sClient, szText, strlen(szText), 0);//recv为阻塞函数,等待sClient中传来数据int nRecv = recv(sClient, rbuf, 256, 0);if(nRecv>0){rbuf[nRecv] = '\0';printf("receive:%s\n", rbuf);}}closesocket(sClient);closesocket(sListen);WSACleanup();return 0;}Server端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf(" Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(4567); //要连接的端口号servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//要连接的IP地址//连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到if(connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){printf(" Failed connect() \n");return 0;}char buff[256];char szText[256];while(true){//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数int nRecv = recv(s, buff, 256, 0);if(nRecv > 0){buff[nRecv] = '\0';printf("receive:%s\n", buff);}printf("send:");scanf("%s",szText);//发送函数,往s这个socket中发送szText这个字符串send(s, szText, strlen(szText), 0);}closesocket(s);WSACleanup();return 0;}2.TCP通信程序数据结构的描述(1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_in remoteAddr;和servAddr(2)用于存储连接客户端的socket:SOCKET sClient;和用于存储连接服务器的socket:SOCKET s3.TCP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度, 之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect( ) 和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用:send( )和recv( ) (或read( )和write( ))来发送和接收数据;最后,待数据传送结束后,双方调用closesocket() 关闭套接口。
TCP UDP客户服务器实验报告

《计算机网络》课程综合实验报告之TCP/UDP服务器端和客户端程序设计院系:信息工程学院专业:电子信息工程姓名:荆林风学号:20142410232一、实验目的学习和掌握Linux环境下的TCP和UDP通信服务器和客户端的基本编程方法和运行机制,掌握TCP/UDP报文段的通信过程。
二、实验平台win10操作系统下VMware Workstation工作环境下linux虚拟机,ubuntu操作系统三、实验内容1..编写Linux下TCP/UDP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。
2.编写Linux下TCP/UDP客户端套接字程序,结合实验一的服务器端程序,实现以下功能:1客户根据用户提供的IP地址连接到相应的服务器;2服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;3客户接收服务器发送的信息并显示。
四、实验原理使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图1.1所示。
1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。
-----------------------------------------------------------------#include<sys/socket.h>int socket(int family,int type,int protocol);返回:非负描述字---成功-1---失败-----------------------------------------------------------------第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。
TCPIP协议与网络编程实验名称基于UDP的客户与服

课程名称《TCP/IP协议与网络编程》实验名称基于UDP的客户与服务器通信实验实验日期2012-3-22 实验报告要求1.实验名称2.实验要求3.实验环境4.实验步骤(写明实验结果) 5.实验体会一、实验名称基于UDP的客户与服务器通信实验二、实验要求需要两台计算机的客户端用键盘输入的方式分别向对方的服务器发送信息,对方的服务器负责接收并且显示信息,两台计算机的通讯。
三、实验环境本实验实例程序使用的编程环境为Visual C++6.0,使用的是控制台程序“Win32 Console Application”。
通讯协议使用无连接的UDP协议。
服务器端IP地址使用的是系统指定的IP地址,端口号在程序中指定的是5050,用符合常量定义。
四、实验步骤1.分别调试,编译,链接客户端的程序和服务器的程序,在程序编译之前,在“工程”→“设置…”→“工程设置”→“对象/库模块”中加入“ws2_32.lib”。
2.执行VC++安装目录下文件夹“bin”中的“Vcvar32.bat”批处理文件。
3.在双方的计算机上都打开服务器,即允许server.exe。
4.在双方计算机的DOS窗口都运行客户端,即cient +IP地址,然后键盘输入信息,双方即可通讯。
五、实验代码(1)client代码:#include<Winsock2.h>#include<stdio.h>#include<iostream>#include<string>using namespace std;#define DEFAULT_PORT 5050#define DA TA_BUFFER 1024void main(int argc,char*argv[]){WSADATA wsaData;SOCKET sClient;int iPort=5050;int iLen;int iSend;int iRecv;char recv_buf[DATA_BUFFER];struct sockaddr_in ser;if(argc<2){printf("Usage:client[server IP address]\n");return;}memset(recv_buf,0,sizeof(recv_buf));if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Failed to load Winsock.\n");return;}ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv[1]);sClient = socket(AF_INET,SOCK_DGRAM,0);if(sClient==INVALID_SOCKET){printf("socket()Failed:%d\n",WSAGetLastError());return;}iLen=sizeof(ser);while(1){string send_buf1 ;char send_buf[1000];const char*pb;cin>>send_buf1;int len =strlen(send_buf1.c_str());cout<<len;pb = send_buf1.c_str();strcpy(send_buf,pb);for(int i=0;i<len;i++)cout<<send_buf[i];iSend=sendto(sClient,send_buf,len,0,(struct sockaddr*)&ser,iLen);if(iSend==SOCKET_ERROR){printf("sendto()Failed:%d\n",WSAGetLastError());return;}else if(iSend==0)return;else {printf("sendto()successed.\n");}}closesocket(sClient);WSACleanup();}(2)server代码:#include<Winsock2.h>#include<stdio.h>#include<stdlib.h>#define DEFAULT_PORT 5050#define BUFFER_LENGTH 1024void main(){int iPort=DEFAULT_PORT;WSADATA wsaData;SOCKET sSocket;int iLen;int iSend;int iRecv;char send_buf[]="I am a server.";char recv_buf[BUFFER_LENGTH];struct sockaddr_in ser, cli;printf("---------------\n");printf("Server watching\n");printf("---------------\n");if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Failed to load Winsock.\n");return;}sSocket=socket(AF_INET,SOCK_DGRAM,0);if(sSocket==INV ALID_SOCKET){printf("socket()Failed:%d\n",WSAGetLastError());return;}ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR){printf("bind()Failed:%d\n",WSAGetLastError());return;}iLen=sizeof(cli);memset(recv_buf,0,sizeof(recv_buf));while(1){iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);if(iRecv==SOCKET_ERROR){printf("recvfrom()Failed.:%d\n",WSAGetLastError());break;}else if(iRecv==0)break;else{printf("Recvfrom():%s\n",recv_buf);printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));}}closesocket(sSocket);WSACleanup();}六、实验结果二、实验体会:本次实验对书上实验程序进行了少许的修改,通过此次实验,让我熟悉了基于UDP的无连接的客户与服务器之间的通讯方法,了解了通讯中需要使用的各种函数及其使用方法。
(完整word版)实验七简单的服务器、客户端程序实验报告

Client:
*
1.Send
Message
*
2.Receive Message
*
3.Exit
Enter your choice:");
gets(Msg); Msg[10239]='\0'; ::send(sock1,Msg,strlen(Msg),0);
} //消息接收函数 void Recect(sock1,(LPSOCKADDR)&my_addr,sin_size))==-1)
{
perror("Accepting stream socket");
exit(1);
}
}
6 / 10
//选择菜单 int menu() {
char *s=(char*)malloc(2*sizeof(char));
char *s=(char*)malloc(2*sizeof(char));
int c; printf("\n\n\n printf(" printf(" printf(" printf(" printf(" do {
printf("\n gets(s); if(s[0]=='\0'){
gets(s); } c=atoi(s); }while(c<0||c>3); free(s); return c;
} //主函数 void main() {
Init(); for(;;) {
switch(menu()) { case 1:
Send(); break; case 2: Receive(); break; case 3: exit(0); } }
TCPUDP协议分析实验

TCPUDP协议分析实验TCP和UDP是网络传输中最常用的两个协议。
它们都属于传输层协议,但是在很多方面有着不同的特点和用途。
为了更好地理解这两个协议的工作原理和性能表现,我们可以进行一些实验来分析它们。
首先,我们可以比较TCP和UDP的连接建立过程。
TCP是一种面向连接的协议,连接的建立需要三次握手,而UDP是无连接的协议,不需要建立连接。
在实验中,我们可以编写一个客户端和一个服务器端来模拟TCP和UDP连接建立过程,并分析连接的建立时间和所占用的网络资源。
从实验结果可以看出,TCP的连接建立时间通常比UDP要长,因为它需要进行三次握手的过程来确保连接的可靠性,而UDP直接发送数据包,不进行握手过程。
其次,我们可以比较TCP和UDP在数据传输过程中的可靠性。
TCP是一种可靠的协议,它使用了序列号、确认应答和重传等机制来确保数据的可靠传输。
而UDP是一种不可靠的协议,它不会对数据进行检查和重传,只是简单地将数据发送给接收方。
在实验中,我们可以通过在网络中引入一些丢包或延迟的条件来模拟不同的网络环境,然后观察TCP和UDP的表现。
从实验结果可以看出,TCP在丢包或延迟的情况下仍能保证数据的可靠传输,而UDP在这种情况下可能会丢失一些数据。
另外,我们还可以比较TCP和UDP的传输效率。
TCP使用了拥塞控制和流量控制等机制来优化传输效率,但是也会因此增加了一些额外的开销。
而UDP没有这些机制,所以在传输效率方面可能会更高。
在实验中,我们可以通过在网络中增加一些流量或者限制带宽等条件来模拟不同的网络负载,并分析TCP和UDP的传输速度。
从实验结果可以看出,UDP在传输效率方面通常比TCP要高,但是也会因为没有拥塞控制而可能导致网络的拥堵。
最后,我们还可以比较TCP和UDP在不同应用场景下的适用性。
TCP 适用于对数据可靠性要求较高的应用,例如文件传输和网页浏览等。
而UDP适用于对实时性要求较高的应用,例如视频流和音频传输等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机网络》课程综合实验报告之TCP/UDP服务器端和客户端程序设计院系:信息工程学院专业:电子信息工程姓名:荆林风学号:20142410232一、实验目的学习和掌握Linux环境下的TCP和UDP通信服务器和客户端的基本编程方法和运行机制,掌握TCP/UDP报文段的通信过程。
二、实验平台win10操作系统下VMware Workstation工作环境下linux虚拟机,ubuntu操作系统三、实验内容1..编写Linux下TCP/UDP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。
2.编写Linux下TCP/UDP客户端套接字程序,结合实验一的服务器端程序,实现以下功能:1客户根据用户提供的IP地址连接到相应的服务器;2服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;3客户接收服务器发送的信息并显示。
四、实验原理使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图1.1所示。
1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。
-----------------------------------------------------------------#include<sys/socket.h>int socket(int family,int type,int protocol);返回:非负描述字---成功-1---失败-----------------------------------------------------------------第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。
2、connect函数:当用socket建立了套接口后,可以调用connect 为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。
-----------------------------------------------------------------#include<sys/socket.h>int connect(int sockfd,const structsockaddr*addr,socklen_t addrlen);返回:0---成功-1---失败-----------------------------------------------------------------第一个参数是socket函数返回的套接口描述字;第二和第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。
这些地址结构的名字均已“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。
以IPv4套接口地址结构为例,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>;以下是结构体的内容:------------------------------------------------------------------struct in_addr{in_addr_t s_addr;/*IPv4地址*/};struct sockaddr_in{uint8_t sin_len;/*无符号的8位整数*/sa_family_t sin_family;/*套接口地址结构的地址簇,这里为AF_INET*/in_port_t sin_port;/*TCP或UDP端口*/struct in_addr sin_addr;char sin_zero[8];};-------------------------------------------------------------------3、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP 或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。
-------------------------------------------------------------------#include<sys/socket.h>int bind(int sockfd,const structsockaddr*server,socklen_t addrlen);返回:0---成功-1---失败-------------------------------------------------------------------第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。
4、listen函数:listen函数仅被TCP服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。
-------------------------------------------------------------------#include<sys/socket.h>int listen(int sockfd,intbacklog);返回:0---成功-1---失败-------------------------------------------------------------------第一个参数是socket函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。
由于listen函数第二个参数的原因,内核要维护两个队列:以完成连接队列和未完成连接队列。
未完成队列中存放的是TCP连接的三路握手为完成的连接,accept函数是从以连接队列中取连接返回给进程;当以连接队列为空时,进程将进入睡眠状态。
5、accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。
-------------------------------------------------------------------#include<sys/socket.h>int accept(int listenfd,struct sockaddr*client,socklen_t*addrlen);回:非负描述字---成功-1---失败-------------------------------------------------------------------第一个参数是socket函数返回的套接口描述字;第二个和第三个参数分别是一个指向连接方的套接口地址结构和该地址结构的长度;该函数返回的是一个全新的套接口描述字;如果对客户段的信息不感兴趣,可以将第二和第三个参数置为空。
6、write和read函数:当服务器和客户端的连接建立起来后,就可以进行数据传输了,服务器和客户端用各自的套接字描述符进行读/写操作。
因为套接字描述符也是一种文件描述符,所以可以用文件读/写函数write()和read()进行接收和发送操作。
(1)write()函数用于数据的发送。
-------------------------------------------------------------------#include<unistd.h>int write(int sockfd,char*buf,int len);回:非负---成功-1---失败-------------------------------------------------------------------参数sockfd是套接字描述符,对于服务器是accept()函数返回的已连接套接字描述符,对于客户端是调用socket()函数返回的套接字描述符;参数buf是指向一个用于发送信息的数据缓冲区;len指明传送数据缓冲区的大小。
(2)read()函数用于数据的接收。
-------------------------------------------------------------------#include<unistd.h>int read(int sockfd,char*buf,intlen);回:非负---成功-1---失败-------------------------------------------------------------------参数sockfd是套接字描述符,对于服务器是accept()函数返回的已连接套接字描述符,对于客户端是调用socket()函数返回的套接字描述符;参数buf是指向一个用于接收信息的数据缓冲区;len指明接收数据缓冲区的大小。
7、send和recv函数:TCP套接字提供了send()和recv()函数,用来发送和接收操作。
这两个函数与write()和read()函数很相似,只是多了一个附加的参数。
(1)send()函数用于数据的发送。
-------------------------------------------------------------------#include<sys/types.h>#include<sys/socket.h>ssize_t send(int sockfd,const void*buf,size_t len,int flags);回:返回写出的字节数---成功-1---失败-------------------------------------------------------------------前3个参数与write()相同,参数flags是传输控制标志。
(2)recv()函数用于数据的发送。
-------------------------------------------------------------------#include<sys/types.h>#include<sys/socket.h>ssize_t recv(int sockfd,void*buf,size_t len,int flags);回:返回读入的字节数---成功-1---失败-------------------------------------------------------------------前3个参数与read()相同,参数flags是传输控制标志。