Unix网络编程学习笔记之基于TCP套接字编程

  一般情况下通过family和type的组合都可以唯一确定一个套接字类型。所以一般我们就把protocol设为0就可以了。

  有时在某些特殊情况下,family和type的组合不是都是有效的,这时我们就要给protocol指定一些特殊的值了。

  从前文可以知道,当客户端接收到服务器端的对SYN的响应的时候,connect函数就返回,若客户端发送的SYN出错,或者响应的ACK出错都会引起connect函数出错。成功返回0,出错返回-1且errno被设置。

  注意:如果connect出错,不能直接重新connect。必须要先关闭这个套接字,然后重新socket-connect。

  (1) 一般服务器端需要绑定一个公开的端口号,而服务器端一般绑定Ip时是INADDR_ANY,意为当accept时,内核会从本地IP地址中选择一个本地IP赋值。这对于一台机器上有多个网络接口时,是很有影响的。

  而通常机器只有一个网络接口,则我们也使用这种方式,是因为我们不必要写服务器本地的IP(硬编码),这样写使得我们的程序有好的移植性。

  (2) 一般客户端socket函数之后就直接connect了,不进行bind,因为我们通常不需指定客户端的Ip和端口号。让内核自动赋值就可以了。

  (3) IPv4中的INADDR_ANY通常为0,所以我们为其赋值时,是使用如下格式:

  因为sin_addr是一个结构体,所以我们使用sin_addr.s_addr来使用其整数形式赋值。

  注意这里的listen并不是我们通常理解的监听的意思,因为套接字不是在这里阻塞的,而是在accept阻塞的。

  (1) 把socket函数创建的套接字,设为被动套接字。因为socket函数默认创建主动套接字,主动套接字:是需要connect去主动连接的。

  这里的疑问?服务器端不是一直在accept阻塞吗,怎么这里还提到进程调用accept这个说法?

  因为这里的情况是在多个客户端几乎同时达到连接时,其中某一个连接发生的情况,因为我们写服务器端程序时,都是把accept写在一个循环内的,所以某个客户的SYN到达,可能这时并没有执行到accept,所以这里说等到进程调用accept时。也就是说,系统在已完成连接队列为空时,accept才会阻塞。

  注意这里所说的backlog是两个队列之和,但实际情况下,一般内核允许排队的个数都要略大于这个值。

  接受客户连接,如果已完成连接队列中有数据,则读取队头,返回一个已连接套接字描述符。如果已完成连接队列为空,则阻塞。

  注意:第三个参数为整型的地址。因为accept函数是从内核得到的套接字。如果程序对客户端的套接字地址不感兴趣,则可以把后面两个参数都设为NULL。

  (2) 一般服务器端bind端口之后,可以调用getsockname获取端口号。

  一般服务器端bind的是通配地址,所以一般不可以获取监听套接字描述符的关联ip地址,而是获取已连接套接字描述符关联的ip地址。

  (3) POSIX允许对未bind的套接字调用getsockname,所以该函数适合任何已打开的套接字描述符(即调用socket函数返回的套接字描述符都叫已打开的套接字描述符),只是不一定输出的是什么。

  1. socket这几个函数都是一样的,成功返回0/描述符,失败返回-1。所以它们判断成功的条件都是一样的。

  (1) 一个目的地为某端口的SYN到达,然后本机没有正在监听该端口的程序,此时本机就发送一个RST。

  (3) TCP接受到一个不存在的连接的分组。即某个客户端没有连接,就往服务器发送数据,这时服务器就会给这个客户端发送RST。

  比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。

  比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!

  比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。

  比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。

  比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。

  比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。

  新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。

  比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。

  比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。

  IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。

  X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。

您可能还会对下面的文章感兴趣: