01_socket编程基础和基本过程-VC.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
01_socket编程基础和基本过程-VC

Socket编程的基础和基本过程 一、什么是socket 接触网络编程当然要了解socket,socket就是套接字,它的定义是一种软件抽象,用于表达两台机器之间的连接‘终端’。对于一个给定的连接,每台机器上都有一个套接字。有点像我们打电话,用电缆把电话连接起来,中间的物理结构和具体实现过程我们不必了解,只要我们能进行通话即可。当我们进行编程时,需要用到socket接口,socket接口定义了许多函数或例程,我们可以直接调用它们实现网络连接、通信等功能。socket接口为我们建立通信信道,我们可以通过这条通道来与一台或多台计算机进行连接。 二、socket编程的基本过程, 下面我们介绍的都是以基本的Windows socket API为例: 1.建立socket: socket编程,其最基本的步骤就是建立socket,下面来看看建立socket的函数原型: SOCKET socket(int af,int type,int protocol ); 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,一般分为流套接字和数据报套接字两种类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败则返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。 2.socket的配置: 通过socket函数调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向客户端的socket通过调用connect函数在socket数据结构中保存本地和远端信息。无连接客户端、服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。下面看看connect函数和bind函数: int bind(SOCKET s, const struct sockaddr FAR *name, int namelen ); 当创建了一个socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的: struct sockaddr { unsigned short sa_family; char sa_data[14]; }; sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET。当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构: struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; 其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数inet_addr把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信。我们用0来填充sin_zero数组,目的是让sockaddr_in结构的大小与sockaddr结构的大小一致。 3. 实现功能 ①服务器端:需要对绑定的端口进行监听,函数原型如下: int listen( SOCKET s, int backlog ); 服务程序可以调用listen函数使其流套接字s处

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档