热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sockets:TCP

大多数TCP服务器是并发的,需要用到fork和exec。父进程关闭已连接套接字描述符connfd,父进程可以接着处理其它客户的连接请求。子进程关闭监听套接字描述符listen

###########################################################

TCP套接字编程相关的系统调用(内核中的传输层):

###########################################################

 

大多数TCP服务器是并发的,需要用到fork和exec。

 

父进程关闭已连接套接字描述符connfd,父进程可以接着处理其它客户的连接请求。

子进程关闭监听套接字描述符listenfd,子进程通过connfd和客户进行通信,完成后用close或exit来关闭子进程的connnfd。

 

已连接套接字描述符每个客户和服务器连接后都有一个,监听套接字描述符一个服务器一般只有一个。

 

客户端用socket函数来获取一个未命名套接字描述符:

服务端用socket函数来获取一个监听套接字描述符:

int listenfd = int socket(int family, int type, intprotocol);

socket的参数都是和协议相关的。

 

family:(网络层协议)

分两种,一般用地址族。

bsd和linux:(AF:地址族)

AF_INET(ipv4域)

AF_INET6(ipv6域)

AF_LOCAL(unix域)=AF_UNIX

AF_ROUTE(路由域)

AF_KEY(秘钥域)

AF_PACKET

 

svr4:(PF:协议族)

PF_INET

PF_INET6

PF_UNIX

PF_NCA

 

type:

SOCK_STREAM(字节流套接字)(tcp、sctp)

SOCK_DGRAM(数据报套接字)(udp)

SOCK_SEQPACKET(有序分组套接字)(sctp)

SOCK_RAW(原始套接字)(ipv4、ipv6)

SOCK_RDM(无序可靠数据报套接字)

 

protocol:(传输层协议)

0:tcp和udp,一般用这个,表示默认值

IPPROTO_SCTP: sctp用这个。

 

客户用connect建立客户端未命名套接字和服务监听套接字的连接:

考虑超时问题

int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen);

sockfd:socket()返回的套接字描述符

struct sockaddr:通用套接字地址结构

addrlen:结构的长度

后两个参数就是服务器的通用套接字地址结构和长度,必须填写。

 

调用bind函数把一个地址和端口赋予一个套接字(给套接字命名):

在建立连接之前如果没有调用bind,内核会选择一个IP和端口号给套接字。

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrltn);

sockfd:socket()返回的套接字描述符

struct sockaddr:ipv4通用套接字地址结构

addrlen:结构的长度,sizeof(struct sockaddr)

如果为通配地址且为INADDR_ANY=0,表示bind时由内核选择IP;

如果用指定的本地IP,就用指定的IP。

如果端口号为0,表示bind时由内核选择端口号;

如果端口号不为0,就用指定的端口。

 

TCP服务调用listen函数来创建队列保存未处理的请求:

int listen(int sockfd, int backlog);

backlog:规定内核应该为相应套接字排队的最大连接个数。

 

连接队列:

未完成队列:三路握手未完成

已完成队列:三路握手完成

 

TCP服务调用accept函数用来接受连接;

并返回一个新的专用的套接字描述符:

考虑超时问题

int cOnnfd= int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

成功返回:已连接套接字描述符

sockfd:监听套接字描述符

cliaddr:返回客户的协议地址

addrlen:返回客户的协议地址的大小, sizeof(struct sockaddr)

后两个参数就是服务器返回的客户端的通用套接字地址结构和长度,不需要可以忽略。

 

发送数据:

write(一般用这个)

send

sendmsg

sendto(不能指定IP和端口号)

 

接收数据:

read(一般用这个)

recv

recvmsg

recvfrom(不返回IP和端口号)

 

关闭套接字描述符:

int close(int sockfd);

close有两个限制:

1.     close把描述符的引用计数减1,仅在计数变为0才关闭套接字。

2.     close终止读和写两个方向的数据传送。

 

关闭套接字描述符:

int shutdown(int sockfd, int how);

how:

SHUT_RD=0:关闭读这一半,套接字中不再有数据可接收,套接字接收缓冲区中的数据也清空。

SHUT_WR=1:关闭写这一半,在套接字发送缓冲区中的数据会被发送出去,然后正常终止连接。

SHUT_RDWR=2:关闭读和写

 

返回与某个套接字关联的本地协议地址:

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t*addrlen);

返回sockfd的通用套接字地址结构和长度。

 

返回与某个套接字关联的对端协议地址:

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);

 

sockets: TCP


推荐阅读
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • 本指南详细介绍了如何利用华为云对象存储服务构建视频点播(VoD)平台。通过结合开源技术如Ceph、WordPress、PHP和Nginx,用户可以高效地实现数据存储、内容管理和网站搭建。主要内容涵盖华为云对象存储系统的配置步骤、性能优化及安全设置,为开发者提供全面的技术支持。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 两个条件,组合控制#if($query_string~*modviewthread&t(&extra(.*)))?$)#{#set$itid$1;#rewrite^ ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在 LeetCode 的“有效回文串 II”问题中,给定一个非空字符串 `s`,允许删除最多一个字符。本篇深入解析了如何判断删除一个字符后,字符串是否能成为回文串,并提出了高效的优化算法。通过详细的分析和代码实现,本文提供了多种解决方案,帮助读者更好地理解和应用这一算法。 ... [详细]
author-avatar
lantian2502889907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有