- 1、本文档共57页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程实例 面向连接套接字应用程序流程图 网络编程实例 在面向连接的通信中服务器和客户在交换数据之前先要建立一个连接。在无连接的通信中数据直接被发送。 无论哪一种方式,服务器总是最先启动,把自己绑定(Binding)在一个套接字上,然后去侦听消息。 网络编程实例 socket() bind() listen() accept() setsockopt() getsockopt() connect() sendto() recvfrom() 网络编程实例 (1)socket() socket()系统调用是为客户或服务器创建一个套接字,创建套接字的函数定义如下所示; #includesys/types.h #includesys/socket.h int socket(int family, int type, int protocol) 网络编程实例 family可以是AF_UNIX或AF_INET等 type可以是SOCK STREAM,它是可靠的,虽然通信速度较慢;也可以是SOCK_DGRAM,它的通信速度较快但不可靠。 如果type为SOCK_STREAM那么protocol为IPPROTO_TCP。如果type为SOCK_DGRAM那么protocol为IPPROTO_UDP。 网络编程实例 如果函数调用出错,函数将返回-1。否则将返回一个套接字描述符,我们可以在程序后面的调用中通过套接字描述符使用这个套接字。 套接字创建时没有指定名字,这是绑定函数所要做的工作。 网络编程实例 (2)bind()系统调用。 bind()系统调用为没有名字的套接字分配一个名字。绑定的定义如下所示: #includesys/types.h #includesys/socket.h int bind(int sockfd, struct sockaddr *saddr, int addrlen) 网络编程实例 第一个参数是一个套接字描述符。第二个参数是名字所使用的一个结构。第三个参数是此结构的大小。 通过调用bind()函数,我们为客户或服务器绑定了一个地址。如果程序是一个服务器,那么它把自己设置为侦听,然后等待连接。 网络编程实例 (3)listen()系统调用。listen()系统调用被服务器所使用。它的定义如下所示: #includesys/types.h #includesys/socket.h int listen(int sockfd, int backlog); 网络编程实例 sockfd是套接字描述符。backlog是在一时间内尚未被决定是否拒绝的连接的号码。一般使用标准值5。如发生错误则返回值小于1。 如果这个调用成功,就可以接收连接了。 网络编程实例 (4)accept()系统调用。accept()调用被服务器用于接收任何从客户connee()调用所引入的消息。必须明白的是如果没有接收到连接这个函数将不返回任何值。它的定义如下所示: #includesys/types.h #includesys/socket.h int accept(int sockfd, struct sockaddr *peeraddr, intaddrlen) 网络编程实例 除peeraddr指向发出连接请求的客户的消息外,其他参数和bind()系统调用的相同。在消息引入的基础上,peeraddr所指向的结构的域被填上相应的值。 网络编程实例 (5)setsockopt()和getsockopt()系统调用。Linux所提供的socket库含有一个错误(bug)。此错误表现为我们不能为一个套接字重新启用同一个端口号,即使在正常关闭该套接字以后。例如,编写了一个服务器在一个套接字上等待的程序,服务器打开套接字并在其上侦听是没有问题的。无论如何,总有一些原因(不管是正常还是非正常的结束程序)使程序需要重新启动。然而重启动后,我们就不能把它绑定在原来那个端口上了。从bind()系统调用返回的错误代码总是报告说我们在试图连接的端口已经被别的进程所绑定了。 网络编程实例 这个问题在于Linux内核在一个绑定套接字的进程结束后从不把端口标记为未用。在大多数UNIX系统中,端口可以被一个进程重复使用,甚至可以被其他进程使用。在Linux中绕开这个问题的办法是,套接字已经打开但尚未有连接的时候,用setsockopt()系统调用在其上设定选项(options)。setsockopt()调用设置选项,而getsockopt()从给定的套接字取得选项。 网络编程实例 setsockopt()和g
文档评论(0)