- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1-* 北京源智天下科技有限公司 联系方式: 联系方式: 北京源智天下科技有限公司 第17讲 面向连接的套接字通信 演讲人:马玉军 e-mail:jtclass@126.com 课程安排 面向连接的套接字通信工作流程 绑定端口 监听与连接 数据的发送与接收 面向连接的套接字通信工作流程 为了实现服务器与客户机的通信,服务器和客户机都必须建立套接字。服务器与客户机的工作原理可以用下面的过程来描述。 (1)服务器先用socket函数来建立一个套接字,用这个套接字完成通信的监听。 (2)用bind函数来绑定一个端口号和IP地址。因为本地计算机可能有多个网卡和IP,每一个IP有多个端口。需要指定一个IP和端口进行监听。 (3)服务器调用listen函数,使服务器的这个端口和IP处于监听状态,等待客户机的连接。 (4)客户机用socket函数建立一个套接字,设定远程IP和端口。 (5)客户机调用connect函数连接远程计算机指定的端口。 (6)服务器用accept函数来接受远程计算机的连接,建立起与客户机之间的通信。 (7)建立连接以后,客户机用write函数向socket中写入数据。也可以用read函数读取服务器发送来的数据。 (8)服务器用read函数读取客户机发送来的数据,也可以用write函数来发送数据。 (9)完成通信以后,用close函数关闭socket连接。 客户机与服务器建立面向连接的套接字进行通信,请求与响应过程可用图17-1来表示。 面向连接的套接字通信工作流程 绑定端口 绑定端口指的是将套接字与指定的端口相连。用socket函数建立起一个套接字以后,需要用bind函数在这个套接字上面绑定一个端口。 提示:只有套接字建立后才能够执行端口绑定操作。 绑定端口函数bind:函数bind可以将一个端口绑定到一个已经建立的socket上,这个函数的使用方法如下所示。 01 int bind(int sockfd,struct sockaddr * my_addr,int addrlen); 参数列表中,sockfd是已经建立的socket编号。sockaddr是一个指向sockaddr结构体类型的指针。sockaddr的定义方法如下所示。 01 struct sockaddr 02 { 03 unsigned short int sa_family; 04 char sa_data[14]; 05 }; 这个结构体的成员含义如下所示。 sa_family:为调用socket()时的domain参数,即AF_xxxx值。 sa_data:最多使用14个字符长度,含有IP地址与端口的信息。 如果建立socket时使用的是AF_INET参数,则sockaddr结构体的定义方法如下所示。 01 struct sockaddr_in 02 { 03 unsigned short int sin_family; 04 uint16_t sin_port; 05 struct in_addr sin_addr; 06 unsigned char sin_zero[8]; 07 }; 绑定端口 结构体的成员addr也是一个结构体,定义方式如下所示。 01 struct in_addr 02 { 03 uint32_t s_addr; 04 }; 在这些结构体中,成员变量的作用与含义如下所示。 sin_family:即为sa_family,为调用socket()时的domain参数。 sin_port:使用的端口号。 sin_addr.s_addr:IP 地址。 sin_zero:未使用的字段,填充为0。 参数addrlen是my_addr的长度,可以用sizeof函数来取得。函数可以把指定的IP与端口绑定到已经建立的socket上面。 如果绑定成功,则返回0。失败则返回-1。函数可能发生下面的错误,可以用error捕获发生的错误。 EBADF:参数sockfd不是一个合法的socket。 EACCESS:权限不足。 ENOTSOCK:参数sockfd是文件描述词,而不是socket。 提示:在使用这个函数以前,需要在程序的最前面包含下面的头文件。 01 #includesys/types.h 02 #includesys/socket.h 绑定端口 bind函数绑定端口实例:下面的实例,是使用bind函数在一个打开的socket上面绑定IP与端口。绑定的端口是5678,IP为INADDR_ANY,表示本地计算机的默认IP地址。 监听与连接 所谓监听,指的是socket的端口处于等待状态,如果有客户端有连接请求,这个端口会接受这个连接。连接指的是客户端向服务端发送一个通信申请,服务端会响应
文档评论(0)