当前位置:文档之家› UDP及TCP通信程序的设计与实现实验报告

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() 关闭套接口。

4.UDP通信程序源代码Client端:#include"stdafx.h"#include<winsock.h>#include<stdlib.h>#include<stdio.h>//在同一主机的不同端口上分别运行服务器程序和客户端程序WORD RPort = 6666; //远程端口RemotePortchar RIP[16]="127.0.0.1"; //远程IP地址RemoteIPAddrWORD LPort = 7777; //本地端口LocalPortchar LIP[16]="127.0.0.1"; //本地IP地址LocalIPAddrSOCKET S; //套接口SOCKETstruct sockaddr_in rAddr; //远程参数,remoteAddrstruct sockaddr_in lAddr; //本地参数,localAddrWSADATA WD; //Winsock DLL信息int r; //result;//-----------------------------------------------void ShowInfo(char *info){puts(info);exit(1);}//-----------------------------------------------void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP){A->sin_family = AF_INET; //TCP/IP协议A->sin_port = htons(Port); //端口A->sin_addr.s_addr =inet_addr(IP); //IP 地址}//------------------------------------------------void main( ){WORD v; //wVersionRequested;//-- - - - - - - - Startup Win socket - - - - - - - -v=0x0101; //0x0101 for v1.1, 0x0002 forv 2.0r = WSAStartup(v, (LPWSADATA)&WD);if(r != 0)ShowInfo("Start_Error");//-- - - - - - - - Create Win socket - - - - - - - -S = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字if(S == -1)ShowInfo("socket_Create_Error");int l=sizeof(rAddr);char Msg[80];puts("Type exit then Quit Program!");SetsockAddr(&lAddr, LPort, LIP);//初始化变量lAddrr = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr));if(r == -1)ShowInfo("bind_Error");SetsockAddr(&rAddr, RPort, RIP);do{//-- - - - - - - - Send Mess - - - - - - - -puts("Send:");gets(Msg);if(!strcmp(Msg,"exit"))//break;r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&rAddr, l);//通过套接字向接收端发送信息if(r == -1)ShowInfo("Send_Error");//-- - - - - - - - Recieve Mess - - - - - - - -puts("Send ok! Waiting Recieve...");// r = recv(S, Msg, 80,0);r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&rAddr, &l);////发送套接口的主机地址信息存放在rAddr中if(r == -1)ShowInfo("Recieve_Error");Msg[r]=0;puts(Msg);puts("Recieve ok!");}while(1);closesocket(S);WSACleanup();return ;Server端:#include"stdafx.h"#include<winsock.h>#include<stdlib.h>#include<stdio.h>//在同一主机的不同端口上分别运行服务器程序和客户端程序WORD RPort = 7777; //远程端口RemotePortchar RIP[16]="127.0.0.1"; //远程IP地址RemoteIPAddrWORD LPort = 6666; //本地端口LocalPortchar LIP[16]="127.0.0.1"; //本地IP地址LocalIPAddr SOCKET S; //套接口SOCKETstruct sockaddr_in rAddr; //远程参数,remoteAddrstruct sockaddr_in lAddr; //本地参数,localAddrWSADATA WD; //Winsock DLL信息int r; //result;//-----------------------------------------------void ShowInfo(char *info){puts(info);exit(1);}//-----------------------------------------------void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP){ A->sin_family = AF_INET; //TCP/IP协议A->sin_port = htons(Port); //端口A->sin_addr.s_addr =inet_addr(IP); //IP 地址}//------------------------------------------------void main( ){WORD v; //wVersionRequested;//-- - - - - - - - Startup Win socket - - - - - - - -v=0x0101; //0x0101 for v1.1, 0x0002 forv 2.0r = WSAStartup(v, (LPWSADATA)&WD);if(r != 0)ShowInfo("Start_Error");//-- - - - - - - - Create Win socket - - - - - - - -S = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字if(S == -1)ShowInfo("socket_Create_Error");int l=sizeof(rAddr);char Msg[80];puts("Type exit then Quit Program!");SetsockAddr(&lAddr, LPort, LIP);//初始化变量lAddrr = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr));if(r == -1)ShowInfo("bind_Error");SetsockAddr(&rAddr, RPort, RIP);do{//-- - - - - - - - Recieve Mess - - - - - - - -//puts("Send ok! Waiting Recieve...");//r = recv(S, Msg, 80,0);r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&lAddr, &l);//发送套接口的主机地址信息存放在rAddr中if(r == -1)ShowInfo("Recieve_Error");Msg[r]=0;puts(Msg);puts("Recieve ok!");//-- - - - - - - - Send Mess - - - - - - - -puts("Send:");gets(Msg);if(!strcmp(Msg,"exit"))//break;r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&lAddr, l);//通过套接字向接收端发送信息if(r == -1)ShowInfo("Send_Error");}while(1);closesocket(S);WSACleanup();return ;}5.UDP通信程序数据结构的描述(1)SOCKET S:服务器套接字(2)struct sockaddr_in rAddr:远程参数,remoteAddr,存储TCP/IP协议,IP地址及端口号(3)struct sockaddr_in lAddr:本地参数,localAddr,存储TCP/IP协议,IP地址及端口号6.UDP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,服务器调用recvfrom ( )等待接收数据。

相关主题