实验三 基于TCP的Winsock编程

合集下载

WinSock编程

WinSock编程

实验三WinSock编程一、实验目的1 熟悉C++/VB的基本操作。

2 基本了解基于对话框的windows应用程序的编写过程。

3 对于Windows Socket编程建立初步概念。

二、实验设备1.两台计算机;2.网卡,网络环境;3.Windows 98/2000操作系统,Turbo C/C++/VB。

三、实验原理(一)Windows Socket和套接口的基本概念网际协议(Internet Protocol,IP)是一种用于互联网的网络协议,已广为人知。

它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如办公室小型网络)和广域网W AN(比如说互联网)。

从它的设计看来,IP是一个无连接的协议,并不能保证数据投递万无一失。

两个上层协议(TCP和UDP)依赖IP协议进行数据通信。

如果希望在Microsoft Windows下通过TCP和UDP协议建立网络应用程序,则需要使用Winsock套接口编程技术。

套接口,就是一个指向传输提供者的句柄。

Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。

Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与4.3BSD Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的API实现Windows式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows中进行网络应用程序设计的接口。

Windows在Internet支配域中的TCP /IP协议定义了Winsock 网络编程规范,融入了许多新特点。

使用Socket 的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。

此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。

计算机网络实验报告 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通信编程实验类型:上机实验同组学生姓名:
一、实验目的和要求〔必填〕二、实验内容和原理〔必填〕
三、要紧仪器设备〔必填〕四、操作方法和实验步骤
五、实验数据记录和处理六、实验结果与分析〔必填〕
七、讨论、心得
一、实验目的和要求
1、学习Visual Basic 的Winsock控件的使用方法;
2、了解TCP/UDP的通信过程;
3、进一步明白得通信分层操纵的优点;
二、实验内容和原理
1、将两台PC机通过以太网连接到同一局域网,用测试软件测试以太网通信是否正常。

2、编写一个简单通信程序,在两台PC上同时运行,要求在一台PC上输入字符,按确认键后
能在另一台PC上显示。

3、编写两个通信程序〔服务器程序和客户机程序〕,要求:
(1)客户机与服务器通过TCP连接后,在其中一台主机上输入字符,按回车键后将所有字符发送到另一台主机并显示;
(2)实验2的文件传输方法改为通过UDP传输,其余要求不变。

三、要紧实验设备
电脑一台,串口线一根
四、实验数据记录和处理
实验程序代码如下:
1.TCP:
2.UDP
五、实验结果与分析
UDP:
六、心得体会
1.使用VB进行编程,更进一步了解了在VB内进行工程项目制作的一样流程。

2.了解了Winsock,并通过关心文件实现功能。

3.刚开始时只能单向收发,经查证是另一端send程序没写,补充后成功。

4.对VB语法有了进一步的熟悉,了解了指令运作的方式和程序编写的方式。

winsock编程实验报告

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编程有了更深入的了解。

基于WinSock的简单TCP网络编程实验报告

基于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. 多线程编程通过在客户端和服务器程序中添加多线程,实现了同时与多个服务器进行通信和同时处理多个客户端的连接请求,提高了程序的并发处理能力。

WINSOCK在网络测试编程中的使用

WINSOCK在网络测试编程中的使用

WINSOCK在网络测试编程中的使用WINSOCK是Windows操作系统提供的网络编程接口,它提供了一种方便的方式来进行网络通信。

在网络测试编程中,WINSOCK是至关重要的一环。

下面将介绍WINSOCK在网络测试编程中的使用。

首先,利用WINSOCK编程可以提供一种方便的方式来测试网络应用程序。

使用WINSOCK编程接口,测试者可以直接连接到网络应用程序,并在测试中模拟特定的网络环境和场景。

同时,WINSOCK还提供了许多用于网络测试的工具包,例如网络协议分析器、流量调度器、模拟器等等,这些工具可以让测试人员更加有效地分析和优化网络应用程序。

其次,WINSOCK介入的实际测试过程中,主要应用场景在于测试网络应用程序的稳定性和性能。

WINSOCK提供了许多用于测试应用程序稳定性的工具,如心跳机制、断线恢复等等。

这些工具能够在应用程序出现意外情况时察觉并恢复,保证网络应用程序的正常运行。

最后,WINSOCK允许用户使用常用的网络协议和通信协议进行测试。

例如,HTTP、SMTP和FTP等常见网络协议可以使用WINSOCK接口进行测试。

在测试中,测试人员可以使用WINSOCK来检测应用程序是否能够正确地处理这些协议所定义的数据格式。

此外,使用WINSOCK还可以测试TCP、UDP、IP等通信协议,这些协议在网络编程中很常见。

综上所述,WINSOCK在网络测试编程中是非常重要的。

它提供了许多工具和解决方案,帮助测试人员检测应用程序的稳定性和性能,同时提供了一种方便的方式来测试网络应用程序。

这些特性使得WINSOCK成为一种非常有用的网络编程接口,有助于加快网络应用程序的开发和调试。

实验基于网络通信协议的设计

实验基于网络通信协议的设计

服务器程序使用的控件如下:
(1)Command1:退出按钮;
(2)textsend:发送数据文本框;
(3)Winsockserver: 服务器Winsock;
(4)textget :接收数据文本框。
服务器程序的界面如图所示。
服务器程序的源代码如下:
Private Sub Command1_Click()
DataArrival事件
当新数据到达时出现。
Error事件
发生错误时出现。
SendProgress事件
在发送数据期间出现。
SendComple事件
在完成一个发送操作时出现。
例:列车时刻表显示。
服务器程序负责提供列车时刻表数据,客户端程序负
责显示服务器所传递的内容。
整个过程有下列步骤组成:
Close方法
关闭一个TCP连接。调用格式:winsock对象.close
Connect方法
用于向远程主机发出连接请求。 调用格式:winsock对象.connect[远程主机IP,远程端口]
GetData和PeekData方法
都是用来取得接收到的数据。GetData取回后要清除接 收缓冲区,PeekData不清除接收缓冲区。 调用格式:winsock对象.getdata(peekdata)变量[,
End
End Sub
Private Sub Form_Load()
Windows网络编程
Windows环境下的Internet编程主要是进行
Sockets编程。
Winsock是Microsoft Windows提供的网络编程
接口,它提供了基于TCP/IP协议的接口实现方

网络编程实验报告

网络编程实验报告

一、实验目的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)文件传输在客户端和服务器端之间进行文件传输。

计算机网络实验3TCP实验

计算机网络实验3TCP实验

计算机网络实验报告三TCP实验1. What is the IP address and TCP port number used by the client computer (source) that is transferring the file to ? To answer this question, it’sprobably easiest to select an HTTP message and explore the details of the TCPpacket used to carry this HTTP message, using the “details of the selected packet header window” (refer to Figure 2 in the “Getting Started with Wireshark” Lab ifyou’re uncertain about the Wireshark windows).答:client computer (source):IP address:192.168.1.102 TCP port number:11612. What is the IP address of ? On what port number is it sendingand receiving TCP segments for this connection?答:the IP address of :IP address:128.119.245.12 port number:803. If you have been able to create your own trace, answer the following question:What is the IP address and TCP port number used by your client computer(source) to transfer the file to ?答:My client computer:IP address:10.2.136.304. What is the sequence number of the TCP SYN segment that is used to initiate theTCP connection between the client computer and ? What is it in the segment that identifies the segment as a SYN segment?答:sequence number:0 ;syn 被设置为1说明是syn段。

Windows网络编程(一)——WinSock编程

Windows网络编程(一)——WinSock编程

WinSock编程实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:实验目的1、了解WinsockAPI2、深刻领会Winsock编程原理3、学会使用Winsock创建简单的TCP服务器以及客户机实验要求1. 整个通信过程参照TCP/IP通信方式;2. 实现整个TCP/IP通信的基本模型;3. 完成基本的界面设计和事件响应;4. 服务器可以同时和多个用户对话,可以同时恢复多个用户;5. 保证信息传输的畅通;6. 服务器可以依次和多个用户对话。

实验内容与分析设计:编写一个基于某种I/O方法的TCP服务器和TCP客户机:能够实现模拟C/S模型的通信方式,服务器端负责信息的接收,并能够返回给客户端相应的消息;客户机负责向服务器发送信息。

注:可以模拟教材95页面向连接的TCP Socket应用程序编程实例。

实验步骤与调试过程:1.打开Visual c++ 6.0编程环境;2.点击文件->新建、选择建立新的工程;选择Win32 Console Application选项建立工程名为“服务器”的一个空工程;3. 继续点击文件->新建、选择建立新的文件;选择C++ Source File选项建立在“服务器”工程下的名为“服务器”的文件;4.编辑源程序->调试;(1)定义头文件和常量,声明两个SOCKET对象,初始化SOCKET环境;(2)创建用于监听的SOCKET环境;(3)设置服务器SOCKET的地址,并绑定socket server 到本地地址,在socket server 上进行监听,而后调用accept()函数等待来自客户端的连接请求;(4)在服务器与客户机之间发送和接收数据;(5)当服务器程序接收到来自客户端的“quit”字符串后,将退出循环并释放占用的资源;5.在组建选项中点击执行【服务器.exe】(或者Ctrl+F5)执行程序;6.运行服务器查看服务器是否处于监听状态。

03实验三 WinSock实现网络通信【必开】

03实验三 WinSock实现网络通信【必开】

实验三WinSock实现网络通信一、实验目的掌握利用WinSock控件实现网络通信的方法。

二、实验任务与要求1. 使用Visual Basic建立通信界面。

2. 利用WinSock控件编程实现点对点(点对多点)通信。

三、实验背景Sockets是在Unix系统上提出来的,一开始主要是用于本地通讯,但很快就应用到C/S体系上。

MicroSoft公司在此基础上创建了WinSock控件,专门用于Windows接口,与Sockets完全兼容。

Winsock控件对用户来说是不可见的,它提供了访问TCP 和UDP 网络服务的方便途径。

Microsoft Access、Visual Basic、Visual C++ 或Visual FoxPro 的开发人员都可使用它。

为编写客户或服务器应用程序,不必了解TCP 的细节或调用低级的Winsock APIs。

通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。

先来看网络通信协议的基础和选择:1.TCP(数据传输协议)基础数据传输协议允许创建和维护与远程计算机的连接。

连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用Connect 方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用Listen 方法。

当客户计算机需要连接时就会发生ConnectionRequest 事件。

为了完成连接,可调用ConnectionRequest 事件内的Accept 方法。

建立连接后,任何一方计算机都可以收发数据。

为了发送数据,可调用SendData 方法。

当接收数据时会发生DataArrival 事件。

调用DataArrival 事件内的GetData 方法就可获取数据。

2.UDP(用户数据文报协议)基础用户数据文报协议(UDP) 是一个无连接协议。

基于winsock的双机通信接字编程

基于winsock的双机通信接字编程

基于winsock的双机通信接字编程双机通信指的是两台计算机之间相互传输数据的过程。

接下来,我们将介绍如何使用Winsock编写基于TCP协议的双机通信程序。

Winsock是Windows Socket的缩写,是Windows平台上进行网络编程的API 标准。

Winsock提供一组函数和结构体,用于编写网络应用程序,例如创建套接字、发送和接收数据等操作。

以下是基于Winsock的双机通信程序的示例代码:c#include <winsock2.h>#include <stdio.h>int main(){WSADATA wsaData;SOCKET s;SOCKADDR_IN addr;int port = 1234;char buf[256];初始化Winsockif (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {printf("WSAStartup failed!\n");return 1;}创建套接字s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET){printf("socket failed!\n");WSACleanup();return 1;}地址设置addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = htonl(INADDR_ANY);绑定套接字if (bind(s, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR) {printf("bind failed!\n");closesocket(s);WSACleanup();return 1;}监听套接字if (listen(s, SOMAXCONN) == SOCKET_ERROR){printf("listen failed!\n");closesocket(s);WSACleanup();return 1;}printf("Waiting for connection...\n");接受连接请求SOCKET clientSocket;SOCKADDR_IN clientAddr;int addrlen = sizeof(clientAddr);clientSocket = accept(s, (SOCKADDR*)&clientAddr, &addrlen);if (clientSocket == INVALID_SOCKET){printf("accept failed!\n");closesocket(s);WSACleanup();return 1;}printf("Connected to %s:%d.\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));发送消息while (1){printf("Enter message: ");fgets(buf, sizeof(buf), stdin);if (send(clientSocket, buf, strlen(buf), 0) == SOCKET_ERROR){printf("send failed!\n");closesocket(clientSocket);WSACleanup();return 1;}if (strcmp(buf, "exit\n") == 0) 输入exit退出循环break;}关闭套接字closesocket(clientSocket);closesocket(s);清理Winsock环境WSACleanup();return 0;}以上代码实现了一个基于Winsock的TCP服务端,它监听特定的端口,并等待客户端连接。

Winsock编程流程_Windows网络与通信程序设计(第3版)_[共3页]

Winsock编程流程_Windows网络与通信程序设计(第3版)_[共3页]

2.3 Winsock 编程详解– 19 –图2.1 打印出本地主机地址信息2.3 Winsock 编程详解使用TCP 创建网络应用程序稍微复杂一些,因为TCP 是面向连接的协议,需要通信双方首先建立一个连接。

本节先以建立简单的TCP 客户端和服务器端应用程序为例,详细说明Winsock 的编程流程,然后再介绍较为简单的UDP 编程。

2.3.1 Winsock 编程流程使用Winsock 编程的一般步骤是比较固定的,可以结合后面的例子程序来理解它们。

1.套接字的创建和关闭使用套接字之前,必须调用socket 函数创建一个套接字对象,此函数调用成功将返回套接字句柄。

SOCKET socket(int af, // 用来指定套接字使用的地址格式,WinSock 中只支持AF_INETint type, // 用来指定套接字的类型int protocol // 配合type 参数使用,用来指定使用的协议类型。

可以是IPPROTO_TCP 等);type 参数用来指定套接字的类型。

套接字有流套接字、数据报套接字和原始套接字等,下面是常见的几种套接字类型定义。

● SOCK_STREAM :流套接字,使用TCP 提供有连接的可靠的传输● SOCK_DGRAM :数据报套接字,使用UDP 提供无连接的不可靠的传输● SOCK_RAW :原始套接字,Winsock 接口并不使用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部。

当type 参数指定为SOCK_STREAM 和SOCK_DGRAM 时,系统已经明确使用TCP 和UDP 来工作,所以protocol 参数可以指定为0。

函数执行失败返回INV ALID_SOCKET (即-1),可以通过调用WSAGetLastError 取得错误代码。

也可以使用Winsock2的新函数WSASocket 来创建套接字,与socket 相比,它提供了更多的参数,如可以自己选择下层服务提供者、设置重叠标志等,后面再具体讨论它。

Winsock实现基于TCP的客户端服务器通信

Winsock实现基于TCP的客户端服务器通信

1.实例题目:Winsock实现基于TCP的客户端/服务器通信。

2.实例分析:确定使用编程环境为Visual C++ 6.00,采用控制台应用程序“Win32 ConsoleApplication”。

本例子为实现简单TCP通信,编写基于TCP的服务器端/客户端通信代码。

3.实例代码:(1)服务器端程序代码sever.cpp#include<Winsock2.h>#include<stdio.h>#include<stdlib.h>#define PORT 5000void main(){int port=PORT;WSADATA wsaData;SOCKET sListen,sAccept;int iLen; //客户地址长度int iSend; //发送数据长度char buf[]="Hello,How are you!"; //需要发送信息struct sockaddr_in serv,cliet; //服务器、客户的地址if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");return;}//创建套接字sListen=socket(AF_INET,SOCK_STREAM,0);if(sListen==INVALID_SOCKET){printf("socket failed:%d\n",WSAGetLastError());return;}else{printf("socket OK!");}//建立服务器地址serv.sin_family=AF_INET;//把一个双字节主机字节顺序的数据转换为网络字节顺序serv.sin_port=htons(port);//把四个字节主机字节顺序转换为网络字节顺序,INADDR_ANY为系统指定的IP地址serv.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR){printf("bind() failed:%d\n",WSAGetLastError());return;}else{printf("bind() OK\n");}//进入监听状态if(listen(sListen,5)==SOCKET_ERROR){printf("listen() failed:%d\n",WSAGetLastError());return;}else{printf("listen() OK\n");}iLen=sizeof(cliet); //初始化客户地址长度//进入循环,等待客户连接请求while(1){sAccept=accept(sListen,(struct sockaddr*)&cliet,&iLen);if(sAccept==INVALID_SOCKET){printf("accept() failed:%d\n",WSAGetLastError());break;}//输出已连接客户IP地址和端口printf("accepted clientIP:[%s],port:[%d]\n",inet_ntoa(cliet.sin_addr),ntohs(cliet.sin_port));iSend=send(sAccept,buf,sizeof(buf),0);if(iSend==SOCKET_ERROR){printf("send() failed:%d\n",WSAGetLastError());break;}else if(iSend==0) break;elseprintf("send() byte:%d\n",send);closesocket(sAccept);}closesocket(sListen);WSACleanup();}(2)客户端程序代码client.cpp#include<Winsock2.h>#include<stdio.h>#define PORT 5000#define BUFFER 1024void main(int argc,char *argv[]){WSADATA wsaData;SOCKET client;int port=PORT;int iLen; //从服务器接受的数据长度char buf[BUFFER]; //接受数据的缓冲struct sockaddr_in serv; //服务器端地址//接受数据缓冲区初始化memset(buf,0,sizeof(buf));if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");return;}serv.sin_family=AF_INET;serv.sin_port=htons(port);serv.sin_addr.s_addr=inet_addr(argv[1]);client=socket(AF_INET,SOCK_STREAM,0);if(client==INVALID_SOCKET){printf("scoket() failed:%d\n",WSAGetLastError());return;}if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET) {printf("connect() failed:%d\n",WSAGetLastError());return;}else{iLen=recv(client,buf,sizeof(buf),0);if(iLen==0) return;else if(iLen==SOCKET_ERROR){printf("recv() failed:%d\n",WSAGetLastError());return;}printf("recv() data from server:%s\n",buf);closesocket(client);WSACleanup();printf("press any key to continue");while(1);}}4.运行实例在进行编译与链接前,需要注意以下几个问题:(1)在Visual C++6.0的"project"-->"setting"-->"project setting"-->"link"-->"object/lib module"中加入"ws2_32.lib"。

WinSock编程流程

WinSock编程流程
3.监听函数listen()
当绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。
int listen(SOCKET s,int backlog);
这个函数可以把套接字转成监听模式。
4.接受信息函数accept()
如果客户端有了连接请求,我们还必须使用
int accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);
short sin_family ;
u_short sin_prot ;
struct in_addr sin_addr ;
char sin_sero[8] ;
}
就包含了需要建立连接的本地的地址,包括地址族、IP和端口信息。sin_family字段必须把它设为AF_INET,这是告诉WinSock使用的是IP地址族。sin_prot就是要用来通讯的端口号。sin_addr就是要用来通讯的IP地址信息。
WinSock编程简单流程
WinSock编程分为服务器端和客户端两部分.
一、TCP服务器端的大体流程如下:
1.初始化函数WSAStarup()
对于任何基于WinSock的编程首先必须要初始化WinSock DLL库。
int WSAStarup( WORD wVersionRequested,LPWSADATA lpWsAData )。
注意:上面的代码没有任何检查函数返回值,如果你作网络编程就一定要检查任何一个WinSock API函数的调用结果,因为很多时候函数调用并不一定成功。上面介绍的函数,返回值类型是int的话,如果函数调用失败的话,返回的都是SOCKET_ERROR。

网络编程基础实验(总)

网络编程基础实验(总)

Winsock网络编程网络应用程序是由通信进程对组成的,每对互相通信的应用程序进程互相发送报文,它们之间的通信必须通过下层的网络来进行。

为了将应用程序和底层的网络通信协议屏蔽开来,采用抽象概念--套接字(Socket)来作为应用程序和底层网络之间的应用程序编程接口(API)。

为了惟一地标识通信对等方的通信进程,套接字必须包含两种信息:(1)通信对等方的网络地址;(2)通信对等方的进程编号,通常称为端口号。

网络接口卡(NIC)Windows Sockets是在Windows环境下使用的一套网络编程规范,简称为Winsock,它来源于“Berkeley Socket”。

Sockets本来是Unix操作系统下流行的一种网络编程接口(API),它是1983年在Berkeley(加州大学伯克利分校)4.2 BSD操作系统中被首先引入的,因此被称为“Berkeley Socket API”。

Winsock API函数的分三类:(1)与BSD Socket(用在Unix中)相兼容的基本函数;(2)网络数据信息检索函数;(3)Windows专用扩展函数三类。

Winsock规范的核心内容是符合Berkeley Socket风格的库函数。

Windows的扩展部分为应用程序开发者提供了开发Windows应用软件的功能,它有利于程序员写出更加稳定并且更加高效的程序。

另外,除了WSAStartup()和WSACleanup()两个函数外,其他Windows扩展函数的使用不是强制性的。

Winsock是通过动态链接库的方式提供给软件开发者的,而且从Windows 95以后已经被集成到了Windows操作系统之中。

Winsock同时包括了16位和32位的编程接口,16位的Windows Socket 2应用程序使用的动链接库是WINSOCK.DLL,而32位的使用WSOCK32.DLL(Winsock1.1版)和WS2_32.DLL(Winsock2.0版)。

winsock编程实验报告

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编程接口的基本用法,掌握了基本的网络通信原理和编程方法。

网络通信是现代计算机应用中非常重要的一部分,掌握网络编程技术对于我们的职业发展具有重要意义。

在今后的学习和工作中,我们将继续深入学习网络编程技术,不断提升自己的能力和水平。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三基于TCP的Winsock编程
1.补充源程序:
客户端:
打开“ChatCli”文件夹→“ChatCli.cpp”文件,查找到“case BUTTON2:”在其下方补充源程序如下:
GetDlgItemText(hW,EDIT2,aa,sizeof(aa));
GetDlgItemText(hW,EDIT3,bb,sizeof(bb));
Cs = socket(PF_INET, SOCK_STREAM, 0); //创建TCP套接字Socket
SA.sin_family = PF_INET; //远程Chat Server的属性:地址类型AF_INET for Internet
SA.sin_port = htons(atoi(bb)); //远程Chat Server的属性:端口
SA.sin_addr.s_addr =inet_addr(aa); //远程Chat Server的属性:IP地址
d=sizeof(SA);
i=connect(Cs,(struct sockaddr *)&SA,d); //连接Chat Server
if(!i)
{ //连接Chat Server成功
EnableWindow(GetDlgItem(hW,BUTTON2),FALSE);
EnableWindow(GetDlgItem(hW,BUTTON1),TRUE);
EnableWindow(GetDlgItem(hW,EDIT2),FALSE);
EnableWindow(GetDlgItem(hW,EDIT3),FALSE);
EnableWindow(GetDlgItem(hW,EDIT4),FALSE);
WSAAsyncSelect(Cs,hW,WM_USER+1,FD_CONNECT|FD_READ|FD_CLOSE);//向Windows注册Socket触发事件
GetDlgItemText(hW,EDIT4,bb,sizeof(bb));
send(Cs,bb,strlen(bb),0); //连接成功后,向Chat Server发送用户登录名}
else
Puts(hW,MEMO1,"connect fail!"); //连接Chat Server失败
Beep(1000,100);
break;
2.运行:
⑴打开ChatSer文件夹→“Release”文件夹,双击ChatSer应用程序,弹出Server 对话框。

⑵打开ChatCli文件夹→“Release”文件夹,双击ChatCli应用程序,弹出Client 对话框。

⑶在同一主机上运行程序:
在自己的主机上都运行ChatSer应用程序和ChatCli应用程序。

点击Server对话
框上“Start”按钮,再点击Client对话框上“Conn”按钮,则在服务器端与客户端进行连接,然后进行聊天。

注意:只能服务器端向客户端发送聊天内容信息,而客户端只能向自己发送聊天信息。

⑷在不同主机上运行程序:
在自己的主机上都运行ChatSer应用程序和ChatCli应用程序,在其他人的机子上只运行ChatCli应用程序。

点击Server对话框上“Start”按钮,再点击所有Client 对话框上“Conn”按钮,则在服务器端与客户端进行连接,然后进行聊天。

注意:服务器端可以向所有客户端广播发送聊天内容信息,而所有客户端可以交互发送聊天信息。

⑸注意:客户端不能向服务器端发送信息。

相关文档
最新文档