《套接字编程.doc》由会员分享,可在线阅读,更多相关《套接字编程.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、华 北 电 力 大 学 实 验 报 告华北电力大学实 验 报 告| 实验名称 套接字编程 课程名称 TCP/IP网络与协议| 专业班级:网络0801 学生姓名:严飞 学 号:200809030125 成 绩:指导教师:李丽芬老师 实验日期:2011.4 基于Winsock的服务器/客户端通信一.实验目的 1掌握客户机与服务器的通信原理。2掌握WinSocket编程技术。实现两机间的通信。二.实验要求利用Visual C+语言中的Winsock控件,采用TCP方式实现一个服务器与客户端间的通信程序。三.实验设计1如果创建客户端应用程序,就必须知道服务器计算机名或者 IP 地址,还要知道进行“侦听
2、”的端口,然后调用 Connect 方法。 2如果创建服务器应用程序,就应设置一个收听端口并调用 Listen 方法。当客户端计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。 3客户机/服务器模型的工作流程4建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。实验流程图如下:5 基于TCP的应用编程实现过程TCP实现方式中,在服务器端设立了一个Winsock控件(侦听套接字)来监听客户端的连接,如果有连接请求到达时,服务器再创建一个新的Winsock控
3、件(连接套接字)来与客户端进行通信,而原来的Winsock控件(侦听套接字)仍处于监听状态,等待新的客户连接请求。四.实验步骤1准备工作1)使用VC+6.0App Wizard创建一个Win32控制台应用程序。2)记住要设置选项,以便添加对MFC的支持3)打开文件stdafx.h,添加语句:#include4)在winsock2.h之后,还要包含conio.h和iostream,h2服务器端的程序 1)使用WSAStartup()初始化Winsock库。WSADATA WSAData;/WSADATA结构将有WSAStartup函数来填充if(WSAStartup(MAKEWORD(2,2),
4、&wsaData) != 0) coutWinsock load failed endl; return; 2)使用socket()创建一个IPPROTO_TCP类型的侦听套接字。sListen = socket(AF_INET, SOCK_STREAM, 0); if (sListen = INVALID_SOCKET) coutsocket failed: WSAGetLastError()endl; return; 3)使用htons ()/htonl ()获取主机套接字和IP地址信息。 serveraddr.sin_port=htons(unsigned short)atoi(argv
5、1); /sin_port成员指定了将要分配给套接字的端口号atoi(argv1serveraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /sin_addr.S_un.S_addr给出了套接字的主机的IP地址 4)使用bind()为套接字关联本地地址。int nBind;nBind=bind(sock,(sockaddr*)&serveraddr,sizeof(serveraddr);/sock是调用socket()函数的返回值,(sockaddr*)&serveraddr是一个WinSock地址结构(指针形式),sizeof(serveraddr)
6、是该地址结构的长度。if(nBind=SOCKET_ERROR)cout Socket Bind失败!endl;return; 5)使用listen()设置套接字进入监听状态,为到达的连接指定一个backlog。int nListen;nListen=listen(sock,SOMAXCONN);/为了能够探测到客户机的连接请求,建立侦听函数,sock是用来进行侦听的套接字。 if(nListen=SOCKET_ERROR) coutSocket Listen 失败!endl;return; 6)使用socket()创建一个IPPROTO_TCP类型的连接套接字。SOCKET tempsock
7、;/创建连接套接字 sockaddr_in tempaddr;/请求连接的套接字地址 7)使用accept()接受请求的连接。tempsock=accept(sock,(sockaddr*)&tempaddr,&templen);/sock是调用listen()函数的侦听套接字,后两个返回所连接的客户机套接字的地址和长度。 if(tempsock=INVALID_SOCKET) cout Socket Accept 失败!=10)closesocket(tempsock);/关闭连接套接字continue; Param.sock=tempsock; Param.addr=tempaddr;DW
8、ORD dwThreadId; CreateThread(NULL,0,ServerThread,&Param,0,&dwThreadId); 9)利用连接套接字与客户端进行数据传输 10)使用closesocket()关闭套接字连接 closesocket(sock);/关闭侦听套接字 11)使用WSACleanup()释放Winsock库。 WSACleanup();3客户端程序 相对于服务器而言,客户端程序比较简单,只需建立一个连接,然后便可以传送数据,使用函数原理与服务器端类似 。 1)使用WSAStartup()初始化Winsock库。 2)使用socket()创建一个IPPROTO
9、_TCP类型的套接字。 3)使用gethostbyname()/gethoustbyaddr()获取主机信息。 4)使用connet()连接到服务器。 5)使用send()/recv()发送和接收数据,直到TCP通信结束。 6)使用closesocket()关闭套接字连接。 7)使用WSACleanup()释放Winsock库。五实验结果1服务器端显示2客户端显示六. 实验总结实验中注意的问题:1在建立客户端与服务器端连接的时候要仔细,不能缺少任何一步,否则就无法建立连接了。2注意编程平台不同,引进数据包文件的差异。3通过与UDP通信的比较,掌握两者之间的异同。4注意在一台机器上实现通信时需要使用回环地址127.0.0.1.七.心得体会通过本次试验,学会了服务器/客户端进行通信的设计,并且了解了这个程序设计的原理。如果仅有一台电脑,也仍然能够进行Winsock编程。可以使用本地回环地址127.0.0.1.这样的话,如果有一个TCP服务器运行在你的电脑上,那么运行在此电脑上的客户程序使用这个回环地址,即可连接到服务器。第 页 共 页