网络程序设计实验报告-Winsock编程接口实验
【最新文档】实验一实验报告-优秀word范文 (6页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==实验一实验报告网络程序设计实验报告实验名称:_ Winsock编程接口实验 _实验类型:_______ 验证型实验 ________指导教师:专业班级:_________XXXXXXXXX__________姓名:________ XXXXXXXXX_____ ________ 学号:_________XXXXXXXXX____________电子邮件:_______XXXXXXXXXXXX________实验地点:_______XXXXXXXXX______________实验日期: XXXXXXXXX实验成绩:__________________________一、实验目的1.掌握Winsock的启动和初始化;2.掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计实验流程图三、实验过程1.在实验过程中调用GetAdaptersInfo()时,出现了undeclared identifier 的报错,原因是没有包含其头文件,但在加了头文件iphlpapi.h后,依然出现如下错误:fatal error C1083: Cannot open include file: 'iphlpapi.h': No such file or directoryError executing cl.exe.查阅资料得知,该错误的出现是因为没有安装SDK,将SDK安装并添加到VC中后,程序错误得到解决。
2.实验结果1.程序主界面2.选择解析指定域名3.选择查看本机信息四、讨论与分析1)Winsock初始化的作用是什么?答:使用winsock初始化可加载winsock编程的动态链接库。
计算机网络实验报告 winsock编程

计算机网络实验一:socket文件传输一、实验目地1、了解网络通信原理。
掌握客户端/服务器程序设计。
2、理解Socket通信原理,掌握使用ServerSocket类和Socket类进行TCPSocket通信的程序设计方法二、实验原理Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。
此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。
计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。
详细如图:我们来分析一下图,Host A上的程序A将一段信息写入Socket中,Socket 的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B 的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
Socket套接口有3种类型。
1.SOCK_STREAM流式套接口,面向连接的,可靠地,TCP。
2.SOCK_DRAM数据报套接口,面向无连接,不可靠,UDP。
3.原始套接口,主要用于新的网络协议实现的测试三、实验分析1、实验要求、按需求编写服务器端和客户端程序代码。
实现:(1)服务器端向客户端提供文件目录。
(2)客户端向服务器端发出请求下载文件。
(3)客户端向服务器端上传文件。
2、Socket通信工作过程如下(1)、建立连接服务器(ServerSocket)监听指定端口,看是否有客户端的连接请求;客户端(ClientServer)创建套接字并通过指定端口请求与服务器建立连接。
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编程有了更深入的了解。
网络编程实验报告

实验一TCP Socket API程序设计一、预备知识1.网络编程基本概念网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。
在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。
套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。
图1-1 TCP通信流程2.TCP通信流程TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。
二、实验目的1.了解Winsock API编程原理;2.掌握TCP Socket程序的编写;3.了解C/S模式的特点;4.学会解决实验中遇到的问题。
三、实验任务使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。
四、实验环境及工具1. Windows2000/XP/72. Visual C++开发平台3. Visual Studio2010五、实验内容和步骤参照《Visual C++网络编程教程》书中81页,TCP Socket API程序设计。
连接:void CChatClientDlg::OnConnect(){WSADATA wsd; //WSADATA结构WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版m_client = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字//服务器地址sockaddr_in serveraddr;UpdateData();if(ServerIP.IsBlank()){AfxMessageBox("请指定服务器IP!");return;}if(sPort.IsEmpty()){AfxMessageBox("请指定端口!");return;}//获取服务器进程的IP和端口BYTE nFild[4];CString sIP;ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);//设置服务器地址结构的内容serveraddr.sin_family = AF_INET;serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);serveraddr.sin_port = htons(atoi(sPort));//发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) != 0){MessageBox("连接失败");return;}else{m_ListWords.AddString("连接服务器成功!");m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);}WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLOSE); //①//界面完善ServerIP.EnableWindow(false);ServerPort.EnableWindow(false);m_ButtonConnect.EnableWindow(false);m_ButtonDisconnect.EnableWindow();m_EditWords.EnableWindow();m_ButtonSend.EnableWindow();m_ButtonExit.EnableWindow(false);m_ButtonClear.EnableWindow();}“断开”按钮的事件过程代码如下:void CChatClientDlg::OnDisconnect(){//断开与服务器的连接closesocket(m_client);m_ListWords.AddString("从服务器断开");m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);ServerIP.EnableWindow();ServerPort.EnableWindow();m_ButtonConnect.EnableWindow();m_ButtonDisconnect.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);m_ButtonExit.EnableWindow();}“发送”按钮事件过程代码如下:void CChatClientDlg::OnSend(){//向服务器发送信息UpdateData();if(m_sWords.IsEmpty()){AfxMessageBox("发送的消息不能为空!");return;}//开始发送数据int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);m_ListWords.AddString("发送:" + m_sWords);m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);}BOOL CChatClientDlg::PreTranslateMessage(MSG* pMsg){if(pMsg->message == 10000) //识别应用程序中定义的消息号{switch(pMsg->lParam) //判断网络事件类型{case FD_READ:this->ReceiveData(); //若为FD_READ则接收数据break;case FD_CLOSE:this->CloseSock(); //如果服务端断开,客户端也断开break;}}elsereturn CDialog::PreTranslateMessage(pMsg);}下面来实现ReceiveData()和CloseSock()方法。
基于WinSock的简单TCP网络编程实验报告

实验报告实验课程名称:通信软件基础实验课学院:软件工程学院专业:软件工程指导教师:报告人姓名:学号:班级:学期:2021实验成绩实验项目名称基于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 TcpThreadParam{SOCKET 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 <TCP server port>";// return -1;//}//初始化winsock2环境WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){cerr << "\nFailed to initialize the winsock 2 stack\n"<< "error code: " << WSAGetLastError() << endl;return -1;}//创建UDP服务器DWORD dwThreadId;CreateThread(NULL, 0, UdpServer, NULL, 0, &dwThreadId);//创建用于侦听的TCP Server SocketSOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, 0);//获取TCP监听端口号u_short ListenPort = (u_short)atoi(argv[1]);//获取本机名char hostname[256];gethostname(hostname, sizeof(hostname));//获取本地IP地址hostent *pHostent = gethostbyname(hostname);//填充本地TCP Socket地址结构SOCKADDR_IN ListenAddr;memset(&ListenAddr, 0, sizeof(SOCKADDR_IN));ListenAddr.sin_family = AF_INET;ListenAddr.sin_port = htons(ListenPort);ListenAddr.sin_addr = *(in_addr*)pHostent->h_addr_list[0];//绑定TCP端口if (bind(ListenSocket, (sockaddr*)&ListenAddr, sizeof(ListenAddr)) == SOCKET_ERROR) {cerr << "\nFailed to bind the ListenSocket\n"<< "error code: " << WSAGetLastError() << endl;return -1;}//监听if ((listen(ListenSocket, SOMAXCONN)) == SOCKET_ERROR){cerr << "\nFailed to listen the ListenSocket\n"<< "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 Socket\n"<< "error code: " << WSAGetLastError() << endl;return -1;}//TCP线程数达到上限,停止接受新的Clientif (TcpClientCount >= MAX_CLIENT){closesocket(TcpSocket);cout << "Connection from TCP client "<< inet_ntoa(TcpClientAddr.sin_addr) << ":" << ntohs(TcpClientAddr.sin_port) << " refused for max client num\n" << endl;continue;}cout << "Connection from TCP client "<< inet_ntoa(TcpClientAddr.sin_addr) << ":" << ntohs(TcpClientAddr.sin_port) << " accepted\n" << 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' << endl;}closesocket(ListenSocket);WSACleanup();return 0;}//TCP服务线程DWORD WINAPI TcpServeThread(LPVOID lpParam){char ServerTCPBuf[MAX_BUF_SIZE];//获取线程参数SOCKET TcpSocket = ((TcpThreadParam*)lpParam)->socket;SOCKADDR_IN TcpClientAddr = ((TcpThreadParam*)lpParam)->addr;//输出提示信息cout<<"Thread: "<< GetCurrentThreadId() << " is serving client from " <<inet_ntoa(TcpClientAddr.sin_addr) << ":"<< ntohs(TcpClientAddr.sin_port) << endl << endl;//发送端口号+"START"sprintf(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 TIME"memset(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 TIME"if (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' << endl;}InterlockedDecrement(&TcpClientCount);closesocket(TcpSocket);return 0;}//UDP服务器线程DWORD WINAPI UdpServer(LPVOID lpParam){char ServerUDPBuf[MAX_BUF_SIZE]; //UDP BufferSOCKADDR_IN UDPClientAddr; //存储Client的地址信息//创建UDP server socketSOCKET UDPSrvSocket = socket(AF_INET, SOCK_DGRAM, 0);//获取本机名char hostname[256];gethostname(hostname, sizeof(hostname));//获取本地IP地址hostent *pHostent = gethostbyname(hostname);//填充本地UDP Socket地址结构SOCKADDR_IN UDPSrvAddr;memset(&UDPSrvAddr, 0, sizeof(SOCKADDR_IN));UDPSrvAddr.sin_family = AF_INET;UDPSrvAddr.sin_port = htons(UDPSrvPort);UDPSrvAddr.sin_addr = *(in_addr*)pHostent->h_addr_list[0];//绑定UDP端口if (bind(UDPSrvSocket, (sockaddr*)&UDPSrvAddr, sizeof(UDPSrvAddr)) == SOCKET_ERROR ) {cerr << "bind() failed for UDPSrvSocket\n"<< "error code: " << WSAGetLastError() << endl;return -1;}cout<<"UDP 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 UDPSrvSocket\n"<< "error code: " << WSAGetLastError() << endl;continue;}cout << "Client Command: Echo\n\n";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 UDPSrvSocket\n"<< "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 ClientBuf[MAX_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 portnum[5];unsigned long BytesReceived,BytesSent;int RetValue;//检查命令行参数if (argc != 3){cout<<"Worng format!"<<endl<<"Correct usage: Client.exe <TCP Server IP> <TCP Server Port>"<<endl;return 1;}u_long ServerIP = inet_addr(argv[1]);u_short ServerTCPPort = (u_short)atoi(argv[2]);//初始化winsock库if( ( RetValue=WSAStartup(MAKEWORD(2,2),&wsadata) ) !=0 ){printf("WSAStartup() failed with error %d\n", 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 %d\n" ,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 %d\n" ,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 %d\n",WSAGetLastError() );printf("Can't connect to server.\n");return 5;}//与server建立连接后读取Server发送过来的Server UDP端口和"START"BytesReceived=recv(cTCPSocket,ClientBuf,sizeof(ClientBuf),0 );if (BytesReceived == 0 || BytesReceived == SOCKET_ERROR){cout<<endl<<"Server refused the connection or recv failed"<<endl;return 6;}memcpy(portnum,ClientBuf,sizeof(portnum));ServerUDPPort=(u_short)atoi(portnum);if (strcmp(START_CMD,ClientBuf+5)!=0){cout<<endl<<"Server did not return right beginning indicator"<<endl;return 6;}else{cout<<endl<<"OK, NOW the server is ready for your service!"<<endl<<endl;}UDPServer.sin_family=AF_INET;UDPServer.sin_port=htons(ServerUDPPort);UDPServer.sin_addr.S_un.S_addr=ServerIP;while(TRUE){//输出提示信息UserPrompt();cin>>UserChoice;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 witherror %d\n",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 witherror %d\n",WSAGetLastError() );printf("Can not get server current systime.Maybe Maybe Server is down.\n");return 8;}cout<<"Server Current Time: "<<ClientBuf<<endl<<endl;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 witherror %d\n",WSAGetLastError() );printf("Can not send message by UDP.Maybe Server is down.\n");return 9;}//读取ECHOmemset(ClientBuf,'\0',sizeof(ClientBuf) );if((BytesReceived=recvfrom(cUDPSocket,ClientBuf,sizeof(ClientBuf),0,(sockaddr*)&RecvFrom, &RecvFromLength ) ) ==SOCKET_ERROR){printf("recvfrom () failed for cUDPSocket witherror %d\n",WSAGetLastError() );printf("Can't get Echo Reply from server by UDP.Maybe Server is down.\n");return 10;}//检查ECHO是否来自Serverif(UDPServer.sin_addr.S_un.S_addr==RecvFrom.sin_addr.S_un.S_addr&&UDPServer.sin_port==RecvFrom.sin_port){cout<<"Get Echo From Server: "<<ClientBuf<<endl<<endl;}else{cout<<"NO Echo From Server"<<endl;}break;case'3': //释放资源,退出程序closesocket(cTCPSocket);closesocket(cUDPSocket);WSACleanup();cout<<"program exit"<<endl;return 10;default:cout<<"Wrong choice ,should be 1,2 or 3"<<endl;}}return 11;}五、实验数据(现象)处理分析。
《网络编程》实验报告

一、实验目的1. 理解网络编程的基本原理和概念。
2. 掌握TCP/IP协议栈的基本工作原理。
3. 学习使用Socket编程实现网络通信。
4. 熟悉网络编程中的多线程编程技术。
5. 提高实际编程能力和问题解决能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 网络编程库:Winsock三、实验内容1. 网络编程基础2. Socket编程3. 多线程编程4. 客户端-服务器模式四、实验步骤1. 网络编程基础(1)了解网络编程的基本概念,如IP地址、端口号、协议等。
(2)学习TCP/IP协议栈的工作原理,包括OSI七层模型和TCP/IP四层模型。
2. Socket编程(1)学习Socket编程的基本原理,包括Socket创建、连接、发送、接收和关闭等操作。
(2)编写一个简单的TCP客户端程序,实现与服务器端的通信。
(3)编写一个简单的TCP服务器程序,接收客户端的连接请求,并实现数据交互。
3. 多线程编程(1)学习多线程编程的基本原理,了解线程、进程、并发和同步等概念。
(2)在客户端程序中添加多线程,实现同时与多个服务器进行通信。
(3)在服务器程序中添加多线程,实现同时处理多个客户端的连接请求。
4. 客户端-服务器模式(1)实现一个简单的文件传输客户端,实现文件的发送和接收。
(2)实现一个简单的文件传输服务器,接收客户端的文件传输请求,并完成文件传输。
五、实验结果与分析1. 网络编程基础通过学习网络编程基础,我们了解了网络编程的基本概念和TCP/IP协议栈的工作原理,为后续的Socket编程打下了基础。
2. Socket编程(1)通过编写TCP客户端程序,实现了与服务器端的通信,验证了Socket编程的基本原理。
(2)通过编写TCP服务器程序,接收客户端的连接请求,并实现了数据交互,进一步巩固了Socket编程的知识。
3. 多线程编程通过在客户端和服务器程序中添加多线程,实现了同时与多个服务器进行通信和同时处理多个客户端的连接请求,提高了程序的并发处理能力。
网络编程实验报告

一、实验目的1. 掌握网络编程的基本概念和原理。
2. 熟悉常用的网络编程工具和技术。
3. 能够编写简单的网络通信程序。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 网络编程库:Winsock三、实验内容本次实验主要涉及以下几个方面的内容:1. Winsock编程基础2. TCP客户端/服务器通信3. UDP客户端/服务器通信4. 简单文件传输四、实验步骤1. Winsock编程基础(1)创建Winsock环境在Visual Studio中,使用Winsock 2库进行编程。
首先,在项目属性中添加Winsock 2库。
(2)初始化Winsock使用WSAStartup函数初始化Winsock环境。
(3)创建套接字使用socket函数创建套接字。
(4)绑定套接字使用bind函数绑定套接字。
(5)连接套接字使用connect函数连接套接字。
(6)发送和接收数据使用send和recv函数发送和接收数据。
(7)关闭套接字使用closesocket函数关闭套接字。
(8)清理Winsock环境使用WSACleanup函数清理Winsock环境。
2. TCP客户端/服务器通信(1)创建TCP服务器端创建TCP服务器端程序,监听客户端的连接请求。
(2)创建TCP客户端创建TCP客户端程序,连接到服务器端。
(3)数据交换在客户端和服务器端之间进行数据交换。
3. UDP客户端/服务器通信(1)创建UDP服务器端创建UDP服务器端程序,接收客户端的数据。
(2)创建UDP客户端创建UDP客户端程序,向服务器端发送数据。
(3)数据交换在客户端和服务器端之间进行数据交换。
4. 简单文件传输(1)创建文件传输服务器端创建文件传输服务器端程序,监听客户端的文件传输请求。
(2)创建文件传输客户端创建文件传输客户端程序,向服务器端发送文件传输请求。
(3)文件传输在客户端和服务器端之间进行文件传输。
实验报告1

网络程序设计实验报告实验名称Winsock编程接口实验实验地点东六E-304实验日期2015年4月6号指导教师贾浩学生班级学生姓名学生学号一、实验目的1、winsock的启动和初始化。
2、gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计1.构造域名解析函数和ip地址查询函数2.初始化windows socket后进入while循环通过输入选择将要执行的操作,如查询主机查询ip通过主机名,得到网络适配器信息,解析域名,退出,等。
3.进入相应操作模块4.预处理输入串并调用相应函数得到结果5.屏幕清空重新选择得到主机名相对简单直接调用函数即可,得通过主机名得到ip和得到网络适配器只需要得调用相应函数即可。
网络适配器由于有多个,需要用while循环输出所有适配器信息。
域名解析设计到多个域名且有错误域名出现,需要预处理得到单个域名,由于错误域名得不到返回值,所以只需要判断结果是否为空。
三、实验过程(包含实验结果)流程图:实验结果:四、讨论与分析1、Winsock初始化的作用是什么?答:只有调用WSAStartup()函数后,应用程序才能调用其他Windows Sockeks API函数,实现网络通信。
2、给出GetAdaptersInfo()函数的正确使用方法?答:该函数可以获取本地主机的所有适配器信息,并保存在pAdapterInfo所指向的链表中。
函数原型为:DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive dataPULONG pOutBufLen // size of data returned);第一个参数pAdapterInfo是指向一个缓冲区指针,其中使用IP_ADAPTER_INFO结构体保存获取到的网络适配器信息;第二个参数pOutBufLen是一个指向ULONG变量的指针,保存pAdapterInfo缓冲区的大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络程序设计
实验报告
实验名称: Winsock编程接口实验
实验类型:____验证型实验_____ __
指导教师:______________________
专业班级:_____________________
姓名:_______________________
学号:_____________________
电子邮件:____________
实验地点:______ _______
实验日期2013 年 3 月29 日
实验成绩:__________________________
一、实验目的
●掌握Winsock的启动和初始化;
●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计
由实验内容可以知道:
1、编写程序能同时实现对多个域名的解析。
比如在控制台输入:getip ,能输出和对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。
首先要了解一些基本的知识gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的基本知识gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
结构的声明与gethostaddr()中一致。
之后要根据内容画出函数流程图
三、实验过程(包含实验结果)
1.在实验过程中调用GetAdaptersInfo()时,出现了undeclared identifier的报错,原因是没有包含其头文件,之后进行一些修改解决了问题.
2.实验结果
3.选择查看本机信息
四、讨论与分析
1.Winsock初始化的作用是什么?
答:使用winsock初始化可加载winsock编程的动态链接库。
2.给出GetAdaptersInfo()函数的正确使用方法。
GetAdaptersInfo 函数使用方法:
1.包含头文件IpHlpApi.h,其库文件为IpHlpApi.lib(已将安装SDK,并将其连接至VC)
2.声明一个IP_ADAPTER_INFO 结构指针变量pAdapterInfo,一个ULONG变量ulOutBufLen。
这些变量作为参数传递给GetAdaptersInfo 函数;
3. 为结构分配内存;
4. 第一次调用GetAdaptersInfo 获取适当的ulOutBufLen 变量大小;
5. 第二次调用传递pAdapterInfo,ulOutBufLen 作为参数, 调用成功时返回网卡信息,失败时返回错误信息。
3.域名解析时出现域名对应多个IP,请解释原因。
大型网站具有多个IP,这是因为其访问量大,使用多个IP保持负载均衡。
所以要使用多个IP同时也可以提高系统吞吐量
五、实验者自评
刚开始的时候对Winsock编程不是很了解,然后看了书中的知识后大概了解了许多关于Winsock编程基本接口的知识,而且在实验过程中有许多的问题,例如最后显示本机IP 地址的时候还需要将debug中的应用程序放入到c盘中,之后尝试了好多次程序就可以运行了,不过,最后终于是写好了,还有些关于套接字的程序书中也有参考的,可以仿照那个去修改一下自己的代码,看看自己的有哪些不足之处,程序写的好的要求是尽量减小系统的利用率,增大系统吞吐量,可以使系统有更高的运行效率。
这次实验是一个简单些的验证型实验,但是对于Winsock编程是一些基础知识,只要先打好了基础知识才可以对于后面的实验能运用自如,所以,以后有时间的时候也要去看书多了解关于这方面的知识。
实验设计的时候还是比较简单的,就是过程有一点繁琐啦!
六、附录:关键代码
while(argc>1)
{
hostent *pHost = ::gethostbyname(*++argv); // 打印出所有IP地址
printf("jiexiyuming %s \n",*argv);
in_addr addr;
for(int i = 0; ; i++)
{
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
printf(" 本机IP地址:%s \n ", szIp); }
argc--;
printf("**************************\n");。