




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告实验课程名称: 通信软件基础实验课 学 院: 软件工程学院 专 业: 软件工程 指导教师: 报告人姓名: 学 号: 班 级: 学 期: 实验成绩实验项目名称基于WinSock的简单TCP网络编程一、实验目的与要求:1、学习和掌握Socket编程的面向连接编程模型。2、学习和掌握基于WinSock的TCP网络编程方法。二、实验设备及软件:笔记本电脑、Window 7操作系统、Microsoft Visual Studio 2012三、实验方法(原理、流程图)流程图:四、实验过程、步骤及内容实验代码:server.h#define MAX_CLIENT 10/同时服务的client数目上限#define MAX_BUF_SIZE 65535/缓存区的大小const u_short UDPSrvPort= 2345;/Server的UDP端口const char START_CMD= START;const char GETCURTIME_CMD= GET CUR TIME;/传递给TCP线程的结构化参数struct TcpThreadParamSOCKET socket;sockaddr_in addr;DWORD WINAPI TcpServeThread(LPVOID lpParam);/TCP线程的线程函数DWORD WINAPI UdpServer(LPVOID lpParam);/UDP服务器线程server.cpp#include stdafx.h#include iostream.h#include stdio.h#include string.h#include time.h#include WinSock2.h#include Windows.h#include server.h#pragma comment (lib, Ws2_32.lib)#pragma pack(1)/结构在存储时按字节对齐long TcpClientCount = 0;int main(int argc, char* argv)/检查命令行参数/if(argc != 2)/cerr Worng format!nCorrect usage: Server.exe ;/return -1;/初始化winsock2环境WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)cerr nFailed to initialize the winsock 2 stackn error code: WSAGetLastError() h_addr_list0;/绑定TCP端口if (bind(ListenSocket, (sockaddr*)&ListenAddr, sizeof(ListenAddr) = SOCKET_ERROR)cerr nFailed to bind the ListenSocketn error code: WSAGetLastError() endl;return -1;/监听if (listen(ListenSocket, SOMAXCONN) = SOCKET_ERROR)cerr nFailed to listen the ListenSocketn error code: WSAGetLastError() endl;return -1;cout TCP Server Started On TCP Port: ListenPort endl endl;SOCKET TcpSocket;SOCKADDR_IN TcpClientAddr;while (TRUE)/接受客户端连接请求int iSockAddrLen = sizeof(sockaddr);if (TcpSocket = accept(ListenSocket, (sockaddr*)&TcpClientAddr, &iSockAddrLen) = SOCKET_ERROR)cerr nFailed to accept the client TCP Socketn error code: WSAGetLastError() = MAX_CLIENT)closesocket(TcpSocket);cout Connection from TCP client inet_ntoa(TcpClientAddr.sin_addr) : ntohs(TcpClientAddr.sin_port) refused for max client numn endl;continue;cout Connection from TCP client inet_ntoa(TcpClientAddr.sin_addr) : ntohs(TcpClientAddr.sin_port) acceptedn endl;TcpThreadParam Param;Param.socket = TcpSocket;Param.addr = TcpClientAddr;/创建TCP服务线程DWORD dwThreadId;CreateThread(NULL, 0, TcpServeThread, &Param, 0, &dwThreadId);InterlockedIncrement(&TcpClientCount);cout Current Number of TCP Clients: TcpClientCount n socket;SOCKADDR_IN TcpClientAddr = (TcpThreadParam*)lpParam)-addr;/输出提示信息coutThread: GetCurrentThreadId() is serving client from inet_ntoa(TcpClientAddr.sin_addr) : ntohs(TcpClientAddr.sin_port) endl endl;/发送端口号+STARTsprintf(ServerTCPBuf, %5d%s, UDPSrvPort, START_CMD);send(TcpSocket, ServerTCPBuf, strlen(ServerTCPBuf), 0);cout Waiting for command from Client(s). endl endl;int TCPBytesReceived;time_t CurSysTime;while (TRUE)/读取client发来的请求命令: GET CUR TIMEmemset(ServerTCPBuf, 0, sizeof(ServerTCPBuf);TCPBytesReceived = recv(TcpSocket, ServerTCPBuf, sizeof(ServerTCPBuf), 0);/TCPBytesReceived值为0表示client端已正常关闭连接/TCPBytesRecieved值为SOCKET_ERROR则表示socket的状态不正常,无法继续数据通讯/两种情况下都表明本线程的任务已结束,需要退出if (TCPBytesReceived = 0 | TCPBytesReceived = SOCKET_ERROR)cout Client from inet_ntoa(TcpClientAddr.sin_addr) : ntohs(TcpClientAddr.sin_port) disconnected. Thread: GetCurrentThreadId() is ending endl endl;break;/检查收到的字符串是否为命令:GET CUR TIMEif (strcmp(ServerTCPBuf, GETCURTIME_CMD) != 0)cout Unknowm command from Client inet_ntoa(TcpClientAddr.sin_addr) endl endl;continue;cout Request for Current time from client inet_ntoa(TcpClientAddr.sin_addr) : ntohs(TcpClientAddr.sin_port) by TCP endl endl;/获取系统时间并发送给clienttime(&CurSysTime);memset(ServerTCPBuf, 0, sizeof(ServerTCPBuf);strftime(ServerTCPBuf, sizeof(ServerTCPBuf), %Y-%m-%d %H:%M:%S, localtime(&CurSysTime);send(TcpSocket, ServerTCPBuf, strlen(ServerTCPBuf), 0);cout Server Current Time: ServerTCPBuf n h_addr_list0;/绑定UDP端口if (bind(UDPSrvSocket, (sockaddr*)&UDPSrvAddr, sizeof(UDPSrvAddr) = SOCKET_ERROR )cerr bind() failed for UDPSrvSocketn error code: WSAGetLastError() endl;return -1;coutUDP Server Started On UDP Port: UDPSrvPort endl endl;while (TRUE)memset(ServerUDPBuf, 0, sizeof(ServerUDPBuf);/接收UDP请求int iSockAddrLen = sizeof(sockaddr);if (recvfrom(UDPSrvSocket, ServerUDPBuf, sizeof(ServerUDPBuf), 0, (sockaddr*)&UDPClientAddr, &iSockAddrLen) = SOCKET_ERROR)cerr recvfrom() failed for UDPSrvSocketn error code: WSAGetLastError() endl;continue;cout Client Command: Echonn;cout ServerUDPBuf received from inet_ntoa(UDPClientAddr.sin_addr) : ntohs(UDPClientAddr.sin_port) by UDP endl endl;/ECHOiSockAddrLen = sizeof(sockaddr);if (sendto(UDPSrvSocket, ServerUDPBuf, strlen(ServerUDPBuf), 0, (sockaddr*)&UDPClientAddr, iSockAddrLen) = SOCKET_ERROR )cerr sendto() failed for UDPSrvSocketn error code: WSAGetLastError() endl;continue;cout Echo ServerUDPBuf to clinet inet_ntoa(UDPClientAddr.sin_addr) : ntohs(UDPClientAddr.sin_port) by UDP endl endl;return 0;client.exe#include stdafx.h#include WinSock2.h#include iostream.h #include stdio.h#pragma comment (lib,Ws2_32.lib)#define MAX_BUF_SIZE 65535char ClientBufMAX_BUF_SIZE;const char START_CMD= START;const char GETCURTIME_CMD= GET CUR TIME;/输出用户选择界面void UserPrompt()cout Input the corresponding Num to select what you want the program to do endl endl t1. Get current time(TCP) endl t2. Echo Mode(UDP) endl t3. Exit the program endl endl Enter Your choice: ;int main(int argc, char* argv)unsigned short ServerUDPPort;SOCKET cTCPSocket,cUDPSocket;WSADATA wsadata;SOCKADDR_IN TCPServer,UDPServer,RecvFrom;int RecvFromLength=sizeof(RecvFrom);char UserChoice;char portnum5;unsigned long BytesReceived,BytesSent;int RetValue;/检查命令行参数if (argc != 3)coutWorng format!endlCorrect usage: Client.exe endl;return 1;u_long ServerIP = inet_addr(argv1);u_short ServerTCPPort = (u_short)atoi(argv2);/初始化winsock库if( ( RetValue=WSAStartup(MAKEWORD(2,2),&wsadata) ) !=0 )printf(WSAStartup() failed with error %dn, RetValue);return 2;/创建TCP Socketif( (cTCPSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED) ) =INVALID_SOCKET)printf(WSASocket() for cTCPSocket failed with error %dn ,WSAGetLastError() );return 3;/创建UDP Socketif( (cUDPSocket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED) ) =INVALID_SOCKET)printf(WSASocket() for cUDPSocket failed with error %dn ,WSAGetLastError() );return 4;TCPServer.sin_family=AF_INET;TCPServer.sin_port=htons(ServerTCPPort);TCPServer.sin_addr.S_un.S_addr=ServerIP;/通过TCP Socket连接serverif (RetValue=WSAConnect(cTCPSocket,(sockaddr *)&TCPServer,sizeof(TCPServer),NULL,NULL,NULL,NULL) )=SOCKET_ERROR)printf(WSAConnect() failed for cTCPSocket with error %dn,WSAGetLastError() );printf(Cant connect to server.n);return 5;/与server建立连接后读取Server发送过来的Server UDP端口和STARTBytesReceived=recv(cTCPSocket,ClientBuf,sizeof(ClientBuf),0 );if (BytesReceived = 0 | BytesReceived = SOCKET_ERROR)coutendlServer refused the connection or recv failedendl;return 6;memcpy(portnum,ClientBuf,sizeof(portnum);ServerUDPPort=(u_short)atoi(portnum);if (strcmp(START_CMD,ClientBuf+5)!=0)coutendlServer did not return right beginning indicatorendl;return 6;elsecoutendlOK, NOW the server is ready for your service!endlUserChoice;switch(UserChoice)case 1:/通过TCP得到server的系统时间/发送命令memset(ClientBuf,0,sizeof(ClientBuf);sprintf(ClientBuf,%s,GETCURTIME_CMD);if (BytesSent=send(cTCPSocket,ClientBuf,strlen(ClientBuf),0) )=SOCKET_ERROR)printf(send() failed for cTCPSocket with error %dn,WSAGetLastError() );printf(Can not send command to server by TCP.Maybe Server is down.n);return 7;/读取server发来的系统时间并显示memset(ClientBuf,0,sizeof(ClientBuf) );if (BytesReceived=recv(cTCPSocket,ClientBuf,sizeof(ClientBuf),0) )=SOCKET_ERROR)printf(recv() failed for cTCPSocket with error %dn,WSAGetLastError() );printf(Can not get server current systime.Maybe Maybe Server is down.n);return 8;coutServer Current Time: ClientBufendlendl;break;case 2: /通过UDP实现ECHO/提示用户输入文本memset(ClientBuf,0,sizeof(ClientBuf) );cout请输入任意文本信息,按回车键后将发送至Server.endl;gets(ClientBuf);/发送文本if (BytesSent=sendto(cUDPSocket,ClientBuf,strlen(ClientBuf),0,(sockaddr *)&UDPServer,sizeof(UDPServer) ) ) =SOCKET_ERROR)printf(sendto() failed for cUDPSocket with er
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拼装箱厂家供货合同范本
- 畜禽养殖合作合同协议书
- 微波烘焙机采购合同协议
- 抖音团队合作协议合同书
- 服装店转让协议三方合同
- 快递运输外包合同协议书
- 月嫂同中介协议合同范本
- 彩钢屋面拆除合同协议书
- 短视频艺人签约合同范本
- 怎样查网上贷款协议合同
- 超声弹性成像技术规范
- 钢材冷弯项目投资可行性研究分析报告(2024-2030版)
- 坝顶拆除方案(3篇)
- 110kV变电站初步设计与规划方案指南
- 企业技术津贴管理办法
- 养老护理员全套培训课件
- 2025年-北京语言大学社会和应届生事业编制人员公招聘考试笔试试卷附答案
- 做账实操-无人机关联行业的账务处理分录
- 空间数据不确定性分析-第2篇-洞察及研究
- 文化设计符号解析-洞察及研究
- 中医适宜技术的临床应用讲课件
评论
0/150
提交评论