




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 WINSOCKET编程一、实验目的通过使用Socket API,加深对TCP和UDP Socket 的认识。二、实验要求两位同学一组,共同完成服务器与客户端程序编写。甲同学通过tcp连接到乙同学服务器(ip:*.*.*.*,端口号:8888)。甲发送自己的学号和姓名到乙服务器,乙服务器返回一个自己的学号和姓名给甲。然后甲通过UDP提交获取到的学号和姓名给乙,如果乙收到正确的信息,则返回的信息为:恭喜,实验成功!若收到信息不对,则返回的信息为:错误认证,实验没有成功!三、实验步骤1甲同学通过TCP连接乙同学服务器 ip:*.*.*.* 端口号:88882使用TCP发送自己的学号和姓名到服务器(姓名用汉语拼音)。3乙同学TCP服务器返回一个自己的学号和姓名给甲,客户端可以使用如下方法来获取。/*#define _MagicNumberT 0xFFFE3141 /tcp标识#define _MagicNumberU 0xFFEF3141 / udp标识#define _ID_Len 32#define_NAME_Len 256typedef struct PacketDWORD magicnum;unsigned char ID_ID_Len;/学号unsigned char Name_NAME_Len;/姓名package;package recvBuffer;send(TCPSocket,(char*)&sendBuffer,sizeof(_A1_Packet),0);/发送TCP 请求包recv(TCPSocket,(char*)&recvBuffer,sizeof(_A1_Packet),0);/接收TCP服务器端的回应puts(char*)recvBuffer.PostData);*/4. 甲通过UDP连接服务器乙,将上面接收到的学号和姓名,发送给UDP服务器乙。 使用sendto()发送到服务器 使用recvfrom()等待服务器的返回信息5. UDP服务器的返回信息存放在PostData中。客服端通过如下方法来查看UDP服务器返回的信息:puts(char*)recvBuffer.PostData);若两次学号与姓名一样,则返回的信息为:恭喜,实验成功!若两次学号与姓名不一样,则返回的信息为:两次字符串不一样,实验没有成功!实验截图:首先开启服务器端:再开启客户端:服务器端显示:源代码:客户端代码:Client.cpp#include #include #include #include #define _MagicNumberT 0xFFFE3141 / TCP 数据包头部标识符 #define _MagicNumberU 0xFFEF3141 / UDP 数据包头部标识符 #define _SNDID_Len 32 / 学号长度 #define _PostData_Len 256 / 最大数据长度 #pragma comment(lib,ws2_32.lib) #pragma comment(linker, /subsystem:console ) typedef struct DWORD magicnum; char SNSID_SNDID_Len; / 学号字段,长度32 char PostData_PostData_Len; / 数据字段,长度256 _A1_Packet; void main() / Initialize Winsock /初始化WSADATA wsaData; int errorCode; int iResult=WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult!=0) printf(初始化套接字失败n); return ; /建立socket SOCKET TCPSocket; TCPSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/ 创建TCP 套接字 /设置Server 端IP 和端口:(TCP/UDP 相同) if (TCPSocket=INVALID_SOCKET) printf(创建套接字失败n); closesocket(TCPSocket); WSACleanup(); return ; /绑socket SOCKADDR_IN server; server.sin_family = AF_INET; server.sin_port = htons(8888); server.sin_addr.s_addr = inet_addr(127.0.0.1); bind(TCPSocket,(struct sockaddr*)&server,sizeof(server); errorCode=connect(TCPSocket, (struct sockaddr *)&server, sizeof(server); /用TCP 连接服务器 if (SOCKET_ERROR = errorCode) printf(连接服务器失败n); closesocket(TCPSocket); WSACleanup(); / return ; / 构造请求数据包: _A1_Packet pkgBuffer; pkgBuffer.magicnum = _MagicNumberT; / 用TCP 数据包头部标识符填充magicnum / 用学号填充SNSID,末尾填0 char IDlen=strlen(20120014); /学号长度 strcpy(pkgBuffer.SNSID,20120014); pkgBuffer.SNSIDIDlen=0; /用姓名填充PostDate,末尾填0 char NAMElen=strlen(Lei Sheng Ping); strcpy(pkgBuffer.PostData,Lei Sheng Ping); pkgBuffer.PostDataNAMElen=0;errorCode=send(TCPSocket,(char *)&pkgBuffer,sizeof(pkgBuffer),0);/ 发送TCP 请求包printf(第一次向服务器发送的数据:n);printf(学号:%s n,pkgBuffer.SNSID);printf(姓名:%s n,pkgBuffer.PostData); if (SOCKET_ERROR = errorCode ) printf(向服务器发送数据失败n); WSACleanup(); / return ; _A1_Packet reBuffer;errorCode=recv(TCPSocket,(char *)&reBuffer,sizeof(_A1_Packet),0);/ 接收服务器端的回应 if (SOCKET_ERROR=errorCode) printf(接受服务器数据失败n); closesocket(TCPSocket); WSACleanup(); return ; printf(接受到服务器传来的数据:n);printf(学号:%s n,reBuffer.SNSID);printf(姓名:%s n,reBuffer.PostData);/puts(char*)reBuffer.PostData);/puts(char*)reBuffer.SNSID);closesocket(TCPSocket); /初始化UDP Socket SOCKET UDPSocket; UDPSocket=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);/ 创建UDP套接字 if (UDPSocket=INVALID_SOCKET) printf(创建套接字失败n); closesocket(UDPSocket); WSACleanup(); return ; /修改magicnum 为UDP 数据包头部标识。填写学号SNSID和提交的数据PostData。reBuffer.magicnum = _MagicNumberU;/用UDP 数据包头部标识符填充magicnum/ 使用sendto()发送到服务器 errorCode=sendto(UDPSocket,(char *)&reBuffer,sizeof(reBuffer), 0, (struct sockaddr *)&server,sizeof(server); /printf(发送%d字节数据包,等待服务器回应.n,errorCode); printf(第二次向服务器发送的数据:n); printf(学号:%sn,reBuffer.SNSID); printf(姓名:%sn,reBuffer.PostData); int addrlen=sizeof(struct sockaddr_in); char recvBuf10; recvfrom(UDPSocket,recvBuf,10,0,(struct sockaddr *)&server,&addrlen); if( strcmp(recvBuf,YES)=0) printf(恭喜,实验成功!); else printf(两次字符串不一样,实验没有成功!);closesocket(UDPSocket); WSACleanup(); getch(); system(pause);服务器端:Service.cpp#include #include #include #include #define _MagicNumberT 0xFFFE3141 / TCP 数据包头部标识符 #define _MagicNumberU 0xFFEF3141 / UDP 数据包头部标识符 #define _SNDID_Len 32 / 学号长度 #define _PostData_Len 256 / 最大数据长度 #pragma comment(lib,ws2_32.lib) #pragma comment(linker, /subsystem:console ) typedef struct DWORD magicnum; char SNSID_SNDID_Len; / 学号字段,长度32 char PostData_PostData_Len; / 数据字段,长度256 _A2_Packet; void main() / Initialize Winsock /初始化WSADATA wsaData; int errorCode; int iResult=WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult!=0) printf(初始化套接字失败n); return ; /建立socket SOCKET TCPSocket; TCPSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/ 创建TCP 套接字 /设置Server 端IP 和端口:(TCP/UDP 相同) if (TCPSocket=INVALID_SOCKET) printf(创建套接字失败n); closesocket(TCPSocket); WSACleanup(); return ; /建立流式套接字 sockaddr_in addr; int nSockErr; addr.sin_addr.S_un.S_addr =inet_addr(127.0.0.1); addr.sin_family = AF_INET; /设定监听端口8888 addr.sin_port=htons(8888); /绑定套接字 if(bind(TCPSocket,(struct sockaddr*)&addr,sizeof(addr) = SOCKET_ERROR) nSockErr = WSAGetLastError(); printf(绑定监听失败!n); / else/ /printf(绑定监听成功!n); / /将套接字设置成监听状态 if(listen(TCPSocket,5) = SOCKET_ERROR) nSockErr = WSAGetLastError(); printf(设置监听失败!n); else printf(设置监听成功,等待连接!n); /等待客户的链接请求 int err,f=0;SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR); SOCKET connectSocket = accept(TCPSocket,(SOCKADDR*)&addrClient,&len); if(connectSocket = INVALID_SOCKET) printf(连接错误!n); nSockErr = WSAGetLastError(); else printf(客户端连接成功!n); _A2_Packet buf; buf.magicnum = _MagicNumberT; /接收客户端传输过来的数据 char n = recv(connectSocket,(char*)&buf,sizeof(_A2_Packet),0); /ar m = recv(connectSocket,buf,2048,0); /printf(%sn,buf); printf(收到客户端发来的数据:n); puts(char*)buf.SNSID); puts(char*)buf.PostData);/ 构造请求数据包: _A2_Packet pkgBuffer; pkgBuffer.magicnum = _MagicNumberT; / 用TCP 数据包头部标识符填充magicnum/ 用学号填充SNSID,末尾填0 char IDlen=strlen(20120025); /学号长度 strcpy(pkgBuffer.SNSID,20120025); pkgBuffer.SNSIDIDlen=0; /用姓名填充PostDate,末尾填0 char NAMElen=strlen(Qin Lu Yan); strcpy(pkgBuffer.PostData,Qin Lu Yan); pkgBuffer.PostDataNAMElen=0;errorCode=send(connectSocket,(char *)&pkgBuffer,sizeof(pkgBuffer),0);/ 发送TCP 请求包 if (SOCKET_ERROR = errorCode ) printf(向客户端发送数据失败n); closesocket(TCPSocket); WSACleanup(); / return ; printf(向客户端发送的数据:n);printf(学号:%s n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省遴选真题及答案
- 2025年公共基础类题目及答案
- 桃源幼师编制试卷及答案
- 2025年数学重叠题目训练及答案
- 龙门翻新工程方案(3篇)
- 特色农产品电商直播基地人才培训与就业创业研究报告
- 2025年浙江省题库及答案
- 2025年品质8d考试试题及答案
- 《2025年度宣传物料设计与安装合同》
- 2025年工地防疫试卷及答案
- 2025年轻型民用无人驾驶航空器安全操控(多旋翼)理论备考试题库(含答案)
- 大学英语 专升本 课件 第十节 定语从句
- 瑜伽急救知识培训课件
- 2《中国人首次进入自己的空间站》课件【知识精研】统编版语文八年级上册
- 切口妊娠介入治疗
- 2024年高校红十字应急救护大赛理论考试题库(含答案)
- 2024年福建省公务员录用考试《行测》真题及答案解析
- c02激光治疗皮肤病
- 占道施工安全培训
- 2024玻璃钢贮罐拆除解体施工合同
- 智能建造施工技术 课件 项目1 智能建造施工概论
评论
0/150
提交评论