Socket网络编程及其实现

上传人:飞*** 文档编号:40509156 上传时间:2018-05-26 格式:DOC 页数:5 大小:77KB
返回 下载 相关 举报
Socket网络编程及其实现_第1页
第1页 / 共5页
Socket网络编程及其实现_第2页
第2页 / 共5页
Socket网络编程及其实现_第3页
第3页 / 共5页
Socket网络编程及其实现_第4页
第4页 / 共5页
Socket网络编程及其实现_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Socket网络编程及其实现》由会员分享,可在线阅读,更多相关《Socket网络编程及其实现(5页珍藏版)》请在金锄头文库上搜索。

1、Socket 网络编程及其实现网络编程及其实现20085249 网络网络 2 班班 李涛李涛【摘要】网络应用程序是通过网络使用通信协议实现进程间的通信,TCP/IP 就是网络上常 用的协议之一,在进行网络应用程序设计时,TCP/IP 协议的核心内容被封装在操作系统 中。因此,可以说设计网络应用程序就是利用网络编程接口(API)进行程序设计的过程。 在 Windows 环境下的网络应用程序编程接口叫 WindowsSockets,即套接口。 关键词:套接口,网络编程,TCP/IP 协议 1 引言网络应用程序是通过网络使用通信协议实现进程间的通信,TCP/IP 就是网络上常用 的协议之一,在进行网

2、络应用程序设计时,TCP/IP 协议的核心内容被封装在操作系统中。 网络应用程序要使用 TCP/IP 协议来实现自己的功能,只能通过由系统提供给用户的 TCP/IP 协议编程接口来实现1。因此,可以说设计网络应用程序就是利用网络编程接口 (API)进行程序设计的过程。在 Windows 环境下的网络应用程序编程接口叫 Windows Sockets,即套接口。2 套接口2.1 套接口的概念WindowsSockets API 依靠套接口 Socket 进行通信。套接口可看成是两个网络应 用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网路应用程序将要 传输的一段信息写入它所在主机

3、的 Socket 中,该 Socket 通过网络接口卡(NIC)的传输 介质将这段信息发送到另一台主机的 Socket 中,使这段信息能传送到其它程序中,如图 1 所示。1当主机 A 上的网络应用程序 A 要发送数据时,通过调用数据发送函数首先将要发送 的一段信息写入 Socket 中,Socket 中的内容通过主机 A 的网络管理软件由主机 A 的网 络接口卡发送到主机 B,主机 B 的网络接口卡接收到这段信息后,再传给主机 B 的网络管 理软件,网络管理软件将这段信息保存在主机 B 的 Socket 中,然后程序 B 才能在 Socket 中读取并使用这段信息。由此看来,Socket 的本

4、质是通信过程中所要使用的一些 缓冲区及一些相关的数据结构。 2.2 套接口的分类为了满足不同的通信程序对通信质量和性能的要求,一般的网络系统提供了三种不同 类型的套接口,以供用户在设计网络应用程序时根据不同的要求来选择。这三种套接口分 别是: (1)流式套接口(SOCK_STREAM) ,它提供了一种可靠的、面向连接的双向数据传输服务,实现数据无差错、无重复地发送。流失套接口内设流量控制,被传输的数据看作 是无记录边界的字节流。在 TCP/IP 协议族中,使用 TCP 协议来实现字节流的传输,当用 户想要发送大批量的数据或者对数据的传输有较高的要求时,使用流式套接口。 (2)数据报套接口(SO

5、CK_DGRAM) ,它提供了一种无连接、不可靠的双向数据传 输服务。免费论文。数据包以独立的包形式被发送,并保留了记录边界,不提供可靠性保 证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。 免费论文。在 TCP/IP 协议族中,使用 UDP 协议来实现数据报套接口。在同一台计算机上 或负载较轻的 LAN 上,因为出现差错的可能性较小,所以可以使用数据报套接口进行数据 传输,这样通信的质量可以得到保证,并且通信的效率较高。 (3)原始套接口(SOCK_RAW) ,该套接口允许对较低层协议(如 IP 或 ICMP)进 行直接访问,常用于检验新的网络协议实现,也可用于

6、测试新配置或安装的网络设备。 3 Socket 编程基础 3.1 Socket 工作模式 Socket 以客户/服务器模式工作。Socket 服务器程序通常事先已经启动,并在一个众 所周知的端口监听对服务的请求。Socket 客户应用程序需要某种服务时,便向提供服务 的 Socket 服务器发出请求,服务器接收到请求后,就响应客户提出的请求2。 3.2 基本套接字的系统调用 应用程序常用的函数列举如下, WSAStarup():检查系统中是否有 WindowsSockets 的实现库 Socket():创建一个 Socket Bind():为创建的 Socket 指定通信对象 Connect(

7、):请求连接 Listen():等待连接状态 Accept():接收连接请求 Send()/Recv():发送接收数据(TCP) Sendto()/Recvfrom():发送接收数据(UDP) CloseSocket():关闭指定的 Socket WSACleanup():释放为应用程序或 DLL 分配的任何资源 3.3 用于无连接协议(如 UDP)的 Socket 系统调用流程框图3.4 用于面向连接协议(如 TCP)的 Socket 系统调用流程框图4 编程实例 本实例使用了 Visual C+6.0 下的控制台程序,该程序中的通信协议使用的是面向连 接的 TCP 协议(SOCK_STRE

8、AM)3。服务器端的 IP 地址使用系统指定的 IP 地址, 端口号在程序中指定为 6000。 4.1 服务器端的实现 建立一个空的基于控制台的应用程序 TCPserver,引入头文件:WINSOCK2.H,在 Projectsettingsinkobject/libarymodules 下引入:ws2_32.lib 库 实现代码如下,#include include in main() WORDwVersionRequested; WSADATAwsaData; Interr; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionR

9、equested, if (err!=0)return 0; if (LOBYTE(wsaData.wVersion)!=1|HIBYTE(wsaData.wVersion)!=1) WSACleanup();return 0;/检查系统中是否有 Windows Sockets 的实现库,如果没有则释放为应用程序或 DLL 分配的任何资源SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);/创建套接口SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/htonl()函数把一个

10、四字节主机字节顺序的数转换为网络字节顺序的数addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);/htons()函数把一个双字节主机字节顺序的数转换为网络字节顺序数bind(sockSrv,(SOCKADDR*)/把套接口与指定的主机 ip 地址和端口号联系起来 listen(sockSrv,5);/进入监听状态,最多同时可以接受 5 个连接请求 SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);while (TRUE)SOCKET sockTemp=accept(sockSrv,(SOC

11、KADDR*)/创建一个临时套接口,与其中一个客户端建立连接char sendbuff1024;sprintf(sendbuff,“Welcome to zhangjie“);/将字符串格式化到 buff 中去 send(sockTemp,sendbuff,strlen(sendbuff)+1,0);/向客户端发送数据char recvBuff1024;recv(sockTemp,recvBuff,strlen(recvBuff)+1,0);/接收客户端发送的数据 printf(“%sn“,recvBuff);closesocket(sockTemp);/关闭套接口return 0;4.2 客

12、户端的实现建立一个空的基于控制台的应用程序 TCPClient,引入头文件:WINSOCK2.H,在 Projectsettingsinkobject/libarymodules 下引入:ws2_32.lib 库实现代码如下,#include #include int main()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequest ed,if (err!=0)return 0;if (LOBYTE(wsaData.wVersio

13、n)!=1|HIBYTE(wsaData.wVersion)!=1)WSAClean up();return 0;/检查系统中是否有 Windows Sockets 的实现库,如果没有则释放为应用程序或 DLL 分配的任何资源SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrClient;addrClient.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1“);/点分十进制转化成 ULong 类型addrClient.sin_family=AF_INET;addrClient.sin

14、_port=htons(6000);/转化成网络字节序 connect(sockClient,(SOCKADDR *)/请求与服务器建立连接 char recvBuff1024;recv(sockClient,recvBuff,1024,0);printf(“%sn“,recvBuff);send(sockClient,“I am zhangjie“,strlen(“I am zhangjie “)+1,0);closesocket(sockClient);WSACleanup();/通信结束后释放资源 return 0;5 小结本文介绍了套接口的基本概念和实现套接口编程的基础,并给出了一个在 VC 平台下 实现的基于 TCP 的客户/服务器通信实例,体现了套接口编程的灵活性。6 参考文献 1任泰明.TCP/IP 协议与网络编程M.第 1 版.西安:西安电子科技大学出版社.2004;94-139 2邹月,陈建兵.Socket 的网络编程研究与实现J.电脑编程技巧与维护.2008.10-12 3谭桂华,魏亮.Visual C#高级编程范例M.第 1 版.北京:清华大学出版社.2004;202-235

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号