网络程序设计实验报告-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缓冲区的大小。
实验一实验报告
网络程序设计实验报告实验名称:_ Winsock编程接口实验_实验类型:_______ 验证型实验________指导教师:_________XXX老师_____________专业班级:_________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编程的动态链接库。
2)给出GetAdaptersInfo()函数的正确使用方法。
GetAdaptersInfo 函数使用方法:1.包含头文件IpHlpApi.h,其库文件为IpHlpApi.lib(已将安装SDK,并将其连接至VC)2.声明一个IP_ADAPTER_INFO 结构指针变量pAdapterInfo,一个ULONG变量ulOutBufLen。
实验一--Winsock编程接口实验
网络程序设计实验报告实验名称:winsock编程接口实验__________实验类型:验证型实验______ ___指导教师:贾浩___________________专业班级:信安0904_________________姓名:_谌军________________________学号:____________________电子邮件:___________实验地点:_东六a座4--17______________实验日期:2012 年 3 月11 日实验成绩:__________________________二、实验设计(一)实验要求如下:1、编写程序能同时实现对多个域名的解析。
比如在控制台输入:getip ,能输出和对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。
(二)设计:1、要实现对域名的解析,最主要是对gethostbyname()函数的理解和应用。
函数原型为:struct hostent *gethostbyname(const char *name);name为指向主机名的指针,它一般由函数gethostname返回。
函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针,该结构格式如下:struct hostent{char FAR* h_name;char FAR* FAR* h_aliases;short h_addrtype;short h_length;char FAR* FAR* h_addr_list;};由于已知主机名(即输入的域名),所以只要调用该函数就能得到ip地址列表。
根据分析可得出程序流程图如下:。
WinSocket编程实验报告
WinSocket编程实验报告实验六:winsock编程实验报告1实验目的和要求1)自学网络中进程之间通信的原理和同时实现方法;2)掌握在vb或vc++等集成开发环境中编写网络程序的方法;3)撰写一个直观的聊天程序:最高建议同时实现两人一组的两台计算机之间的通话文本及其表明;2实验设备及分组1)windows2000以上操作系统;2)vb和visualc++6.0语言环境;3)每人一台pc 机。
3实验内容和步骤3.1设计服务器界面图3-1服务器界面3.2设计客户端界面先建立一个工程,取名为client。
在窗体中加入控件:将winsock控件添加到窗体里,名称属性改为winsockclient。
建立两个richtextbox,richtextbox1的名称属性改为textget,scrollbars属性改为3-rtfboth,locked属性改为true,richtextbox2的名称属性改成textsend,scrollbars属性改成3-rtfboth。
在窗体里图3-2客户端界面3.3编写程序及其表明3.3.1服务器程序winsockserver.senddata\textget.text=textget.text&a&\vbcrlf‘可以自动下划线,并存有时间表明textsend.text=\‘发送完毕后,文本框自动清空endsubprivatesubform_load()‘窗体读取时,传送文本框与发送文本框不可知textsend.visible=false‘发送信息文本框不可知textget.visib le=false‘发送信息文本框可知winsockserver.localport=1001‘服务器端口号设置winsockserver.listen‘服务器侦听endsubprivatesubwinsockserver_close()winsockserver.close‘停用服务器endsubprivatesubwinsockserver_connectionrequest(byvalrequestidaslong)‘连接后,winsock控件工作textsend.visible=truetextsend.text=\‘清空文本框信息textget.visible=truetextget.text=\ifwinsockserver.state<>sckclosedthenwinsockserver.close‘如果socket没有关闭,则关闭socketwinsockserver.acceptrequestid‘服务器拒绝接受命令,拒绝接受以后双方就可以发送数据msgbox(\连接server成功!\endsubprivate subwinsockserver_dataarrival(byvalbytestotalaslong)‘信息发送dimtmpstrasstringdimaasstringa=\客户端:\winsockserver.getdatatmpstrtextget.text=textget.text&a&tmpstr&vbcrlfendsub3.3.2客户端程序aa=\客户端:\winsockclient.senddata\textget.text=textget.text&aa&\vbcrlftextsend.text=\endsubprivatesubform_load()‘程序读取,文本框不可知text1.text=\这里输入要连接的服务器的ip\‘提示输入ip地址textsend.visible=falsetextget.visible=falsewinsockclient.remoteport=1001’客户端端口号设置为1001winsockclient.remotehost=\endsubprivatesubtext1_change()winsockclient.remotehost=text1.text‘客户端检验主机名endsubprivatesubwinsockclient_close()‘关闭客户端winsockclient.closeendsubprivatesubwinsockclient_connect()‘客户端相连接textsend.visible=truetextsend.text=\textget.visible=truetextget.text=\privatesubwinsockclient_connectionrequest(byvalrequestidaslong)textsend.visible=truetextsend.text=\textget.visible=truetextget.text=\ifwinsockserver.state<>sckclosedthenwinsockserver.close‘如果socket没停用,则停用socketwinsockserver.acceptrequestidendsubprivatesubwinsockclient_dataarrival(byvalbytestotalaslong)‘信息发送dimtmpstrasstringdimaasstringa=\服务器:\winsockclient.getdatatmpstrtextget.text=textget.text&a&tmpstr&vbcrlfendsub3.4运行程序3.4.1客户端运行结果图3-3客户端相连接运行后,填写要连接的主机的ip地址,点击连接,成功后,会提示连接服务器成功。
北京理工大学-计算机网络实践-WinSock点对点通信实验报告
一、实验目的:
WinSock 是 Windows 操作系统下的 Socket 编程接口,通过 WinSock 函数库 可以实现基于 TCP/IP 协议的进程之间通信。
理解基于 WinSock 的客户/服务器概念 掌握使用 WinSock 进行编程的方法 了解常见 WinSock 开发模式的使用
SBind();
SAccept(); /* 循环发送请求 */
while(1)
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配0料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高高与中中带资资负料料荷试试下卷卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并中3试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
Windows 网络编程 实验报告二
实验报告学院:计算机科学与信息工程学院专业:信息安全班级:姓名学号实验组实验时间指导教师成绩实验项目名称实验二无连接的套接字程序设计实验目的1、掌握控制台程序设计的基本方法。
2、掌握在该网络环境下如何利用套接字及UDP协议实现无连接的网络通信。
3、了解利用无连接的套接字通信的实现原理。
实验内容利用数据报套接字实现对等模式的网络通信,要求通信双方从标准输入设备接收信息,并向对方发送接收到的信息。
通信双方生成一个可打印的字符串信息,并显示收到的信息,然后关闭套接字并退出。
实验原理和方法使用Winsock进行网络通信程序的设计,要通过本次试验初步了解如何利用无连接套接字进行控制台程序的编制,为以后自己编制类似的程序打下良好的基础。
程序执行方法命令行语法:程序名目的IP 目的端口源IP 源端口注意:端口号为自由端口号。
实验环境Pc机VC++ 6.0环境实验步骤1. 启动Visual C++6.0开发环境从“开始”菜单中选择“程序| Microsoft Visual Studio 6.0 | Microsoft Visual C++ 6.0”,显示Visual C++6.0开发环境窗口。
2. 创建一个项目(1)单击File菜单中的New选项,显示New(新建)对话框。
(2)单击Project(项目)标签,在Project选项卡中,选择Win32 Console Application(Win32控制台应用程序向导)。
在Location(位置)文本框中指定一个路径,在Project Name(项目名称)文本框中为项目输入一个名字(例如:lab2),单击OK按钮。
(3)依据提示单击下一步按钮,直到最后一步点击完成按钮,完成项目的建立。
(4)项目建立好后,注意包含的各种头文件和相应的库文件。
3.编写源程序文件4.建立并运行可执行程序(1)选择菜单命令Build | Build lab2.exe,建立可执行程序。
实验七网络程序设计综合实验
网络程序设计实验报告实验名称: winsock 编程接口实验实验类型:设计型指导教师:贾浩专业班级:信安1204 姓名:马灿学号: 20123252 电子邮件:实验地点:东6 E307 实验日期:实验成绩:__________________________实验七网络程序设计综合实验摘要:本课程设计包含了文件传输协议的简单设计及实现。
文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
文件传输协议的简单设计及实现建立在计算机网络实验环境TCP/IP网络体系结构之上,使用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),利用了已有网络环境设计并实现简单应用层协议。
本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。
关键词:SOCKET编程,FTPclient/server程序一.问题描述及设计思路1.1 问题描述服务器端:1.指定一个目录作为FTP目录(之后所有的文件操作均在此目录下进行)2.接收客户端的命令请求并提供相应的服务。
客户端:完成及FTP用户的人机界面,以命令的方式向服务器请求服务,主要的命令有: 1.CONNECTIP地址端口号2.指定FTP服务器的IP地址和端口号,连接到服务器。
响应:连接成功/失败。
3.LOGIN用户名4.用户登录(假设在服务器端有用户管理功能)5.响应:若用户不存在,提示“无此用户”;若用户存在,提示“密码:”;用户输入密码后,若正确提示“登录成功”;若不成功,提示“密码错误”。
6.3.DIR7.显示FTP服务器的FTP目录的文件列表(假设无子目录)8.响应:目录列表(只要文件名即可)。
9.4.GET文件名10.将FTP目录下的文件下载到本地,支持断点续传11.响应:传送成功/失败/无此文件。
winsock编程实验报告
winsock编程实验报告Winsock编程实验报告引言Winsock是Windows操作系统中用于网络通信的编程接口,它提供了一组函数和数据结构,使程序员能够在Windows平台上进行网络编程。
在本实验中,我们将探讨如何使用Winsock编程接口来实现基本的网络通信功能。
实验目的本实验的目的是通过Winsock编程实现一个简单的客户端-服务器模型,了解基本的网络通信原理和编程方法。
实验环境本实验使用了Windows操作系统和Visual Studio集成开发环境。
在实验过程中,我们使用了C/C++语言进行编程。
实验步骤1. 初始化Winsock库在程序中调用WSAStartup函数来初始化Winsock库,这是进行网络编程的第一步。
2. 创建套接字使用socket函数创建一个套接字,套接字是网络通信的基本单元,它包含了通信的协议和地址信息。
3. 绑定套接字使用bind函数将套接字绑定到本地地址和端口上,这样就可以在这个地址上进行通信。
4. 监听连接如果是服务器端程序,需要调用listen函数来监听连接请求,等待客户端程序的连接。
5. 建立连接客户端程序使用connect函数来连接服务器端程序,建立通信连接。
6. 发送和接收数据使用send和recv函数来发送和接收数据,实现网络通信功能。
实验结果经过实验,我们成功实现了一个简单的客户端-服务器模型,在这个模型中,客户端程序能够向服务器端程序发送数据,并接收服务器端程序的响应。
我们也测试了程序的稳定性和可靠性,发现程序能够正常工作并且没有出现明显的问题。
结论通过本次实验,我们了解了Winsock编程接口的基本用法,掌握了基本的网络通信原理和编程方法。
网络通信是现代计算机应用中非常重要的一部分,掌握网络编程技术对于我们的职业发展具有重要意义。
在今后的学习和工作中,我们将继续深入学习网络编程技术,不断提升自己的能力和水平。
实验一 Winsock编程接口实验
实验一 Winsock编程接口实验1实验类型验证型实验2实验目的●掌握Winsock的启动和初始化;●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
3背景知识(1)Winsock基本概念Winsock即Windows Sockets的简称,是在Windows操作系统平台下使用的套接字接口。
自Winsock2规范开始,Windows Sockets就成为了一个得到广泛应用的、开放的、支持多种协议的网络编程接口。
它是一个与协议无关的传送接口,可以用该接口来调用大多数网络协议,而不需要知道这些协议具体的实现细节。
Win32平台下的Winsock编程接口支持的协议包括:IP、IPX/SPX、NetBIOS、AppleTalk、A TM等,这些协议具有相当大的差异,例如它们支持不同范围的网络、不同的寻址方式、不同的传输介质等,但它们的调用操作大多数是相同的。
因此,定义统一的Winsock编程接口,有利于实现采用统一的方法对实现对不同协议的调用,简化网络程序设计过程。
Winsock编程接口的实质是一套API(Application Programming Interface,应用编程接口),称为Winsock API,由一系列函数构成。
在编写网络程序的时候,经常需要跟这些函数打交道,通过对这些函数的调用,实现对具体网络协议的控制,达到实现网络事务的目的。
(2)Winsock的启动和终止由于Winsock的服务是以动态链接库Winsock DLL(在Windows安装目录下的system32下,假如Windows安装在C:\WINNT目录下,则在C:\WINNT\ system32目录下可以找到winsock.dll)形式实现的,因此必须先调用WSAStartup函数实现对Winsock DLL的初始化,协商Winsock的版本,并分配必要的资源。
实验三WINSOCK套接字编程实验报告范文
实验三WINSOCK套接字编程实验报告范文一、实验目的:用C或JAVA语言编写客户端、服务器程序,实现基于TCP或UDP的网络通信数据传输服务,熟悉基于TCP或UDP的Socket编程原理。
二、实验环境:建立在TCP/IP网络体系结构之上计算机网络实验环境。
各计算机除了安装TCP/IP软件外,还安装了TCP/IP开发系统。
计算机具备Window环境中套接字ocket的编程接口功能,可为用户提供全网范围的进程通信功能。
三、实验步骤(1)运行指导书中给出的参考程序,分析实验结果,并回答问题(1)-(3)(2)根据给定参考程序修改代码,完善修改服务器和客户端的功能。
并回答问题(4)-(5)四、实验结果分析(1)为什么在服务器和客户端要包含winock2.h文件?答:因为无论服务器端程序还是客户端程序都要建立ocket,如果不包含winock2.h文件就无法创建ocket,没有ocket服务器与客户端就无法通信。
答:因为要告诉链接器生成e某e时链接这个库中的函数。
当然也可以通过别的方法告诉链接器。
就是让程序在链接的时候将w2_32.lib 这个文件链接进来,如果没有这句话,你也没有在工程的ClaWizerd选项卡的Link选项卡中加入这个文件的时候,链接就会提醒某些函数没有被链接到!有了这个文件,一般就是提供某一些函数的实现代码,只不过不是以字符形式存储的!(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用,程序会有什么问题?答:WSADATAwaData;wVerionRequeted=MAKEWORD(2,2);err=WSAStartup(wVerionRequeted ,&waData);第一个参数是版本号即2.2版本,第二个参数返回ocket的版本信息操作系统利用第二个参数返回请求的Socket的版本信息。
当一个应用程序调用Startup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。
NP 实验报告一
Windows网络程序设计实验报告一(流式套接口编程)计算机科学与工程系. 07级_____________专业 ___ __班学号:__ ____ 实验人:____ _ __ 在internet协议属性处设置2个IP地址:192.168. .1和192.168. .2 服务器端: (IP:192.168. . 1)1、#include <winsock2.h>目前常使用的Winsock有两个版本,在本程序中使用的是:位的2、所有的Winsock函数都从WS2_32.DLL导出,VC++在默认情况下并没有链接到该库,如想使用Winsock API,就必须包含相应的库文件,有两种方法:方法一:添加代码#pragma comment(lib,"WS2_32")方法二:点击——在project settings对话框中选择选项卡,在工程选项中添加:3、加载动态链接库WSADATA wsaData;WORD wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)printf("|WSAStartup Error = %d\n",WSAGetLastError());else printf("加载Winsock库成功|\n");4、创建流式套接口s (该套接口又称为:套接口)SOCKET s = socket( AF_INET , , );5、绑定struct sockaddr_in Sadd;Sadd.sin_family=AF_INET;Sadd.sin_port= htons(5555); // 函数htons()的作用:Sadd.sin_addr.s_addr=inet_addr("190.168. .1");// 函数inet_addr ( )的作用:Sadd.sin_addr.s_addr等价于另一写法bind( , , )6、监听listen(s,2);//意味着第三个请求的客户端将收到connect返回信息,错误代码为7、接受请求struct sockaddr_in Cadd; //该结构体变量记录:①服务器端的地址②客户端的地址int CaddLen= sizeof(Cadd);SOCKET c = accept(s, (sockaddr*)& Cadd, &CaddLen);如无错发生,函数accept( )返回:用于:所以套接口c又被称为:套接口8、关闭套接口 closesocket( )在本程序中需要关闭个套接口,它们是:9、终止使用WinsockWSACleanup();客户端: (IP:192.168. . 2)客户端程序前面部分同服务器端1~5(注意:本程序要求客户端也需绑定)4、创建流式套接口cc5、struct sockaddr_in CCadd用于记录客户端自己的地址,以用于绑定6、请求连接connect( , , )7、关闭套接口 closesocket( )在本程序中需要关闭个套接口,它们是:8、终止使用WinsockWSACleanup();-----------------------------------------------------------------------------------回答----------------------------------------------------------------------------------- 1、如果客户端绑定时使用了地址192.168. .3 (而该地址并没有在internet协议属性处设置),则程序将返回什么错误:错误代码是:含义是:2、在服务器端程序中,调换一下各个函数使用的位置,是否一定要按照P132的流程?是否可先socket( ),之后再WSAStartup( ),函数socket( )将返回错误代码是:含义是:是否可以先bind( ),之后再socket( ),将会出现什么问题:3、关于本次实验你的心得体会。
- 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");。