由socket的accept说开去

多线程下socket的bind、accept函数分析以及对socket端口号的深入理解 本文原创,欢迎转载,转载时请注明出处,谢谢:https://blog.youkuaiyun.com/zz420521/article/details/81914358 我们知道,在TCP协议下的网络通讯,服务器在accept之后会生成一个新的套接字与客户端进行通讯,这个新套接字的端口是提供给客户端的,所以是属于客户端的端口,等下有试验证明。 一般来说,服务器accept返回的这个新套接字的端口号是操作系统... 阅读详情

       今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口?

    讨论完后,才发现,自己虽然熟悉socket的编程套路,但是却并不是那么清楚socket的原理,今天就趁这个机会,把有关socket编程的几个疑问给搞清楚吧。

    先给出一个典型的TCP/IP通信示意图。

 

    问题一:socket结构体对象究竟是怎样定义的?

    我们知道,在使用socket编程之前,需要调用socket函数创建一个socket对象,该函数返回该socket对象的描述符。

 
  1. 函数原型:int socket(int domain, int type, int protocol); 

    那么,这个socket对象究竟是怎么定义的呢?它记录了哪些信息呢?只记录了本机IP及端口、还是目的IP及端口、或者都记录了?

    关于这个问题,大家可以在内核源码里面找,也可以参考这篇文章《struct socket 结构详解》,我们可以看到 socket  结构体的定义如下:   

 
  1. struct socket   
  2. {   
  3.     socket_state              state;   
  4.     unsigned long             flags;   
  5.     const struct proto_ops    *ops;   
  6.     struct fasync_struct      *fasync_list;   
  7.     struct file               *file;   
  8.     struct sock               *sk;   
  9.     wait_queue_head_t         wait;   
  10.     short                     type;   
  11. };   

    其中,struct sock 包含有一个 sock_common 结构体,而sock_common结构体又包含有struct inet_sock 结构体,而struct inet_sock 结构体的部分定义如下:

 
  1. struct inet_sock   
  2. {   
  3.     struct sock     sk;   
  4. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)   
  5.     struct ipv6_pinfo   *pinet6;   
  6. #endif   
  7.     __u32           daddr;          //IPv4的目的地址。   
  8.     __u32           rcv_saddr;      //IPv4的本地接收地址。   
  9.     __u16           dport;          //目的端口。   
  10.     __u16           num;            //本地端口(主机字节序)。  
  11.     
  12. …………      
  13. } 

     由此,我们清楚了,socket结构体不仅仅记录了本地的IP和端口号,还记录了目的IP和端口。

     问题二:connect函数究竟做了些什么操作?

     在TCP客户端,首先调用一个socket()函数,得到一个socket描述符socketfd,然后通过connect函数对服务器进行连接,连接成功后,就可以利用这个socketfd描述符使用send/recv函数收发数据了。

    关于connect函数和send函数的原型如下:

 
  1. int connect( int sockfd, const struct sockaddr* server_addr, socklen_t addrlen)  
  2.  
  3. int send( int sockfd, const void *msg,int len,int flags); 

    那么,现在的困惑是,为什么send函数仅仅传入sockfd就可以知道服务器的ip和端口号?

    其实,由“问题一”中的答案我们已经很清楚了,sockfd 描述符所描述的socket对象不仅包含了本地IP和端口,同时也包含了服务器的IP和端口,这样,才能使得send函数只需要传入sockfd 即可知道该把数据发向什么地方。而代码中,目的IP和端口只是在connect函数中出现过,因此,肯定是connect函数在成功建立连接后,将目的IP和端口写入了sockfd 描述符所描述的socket对象中。

    问题三: accept函数产生的socket有没有占用新的端口?

    首先,回顾一下accept函数,原型如下:

 
  1. /* 参数:sockfd 监听套接字,即服务器端创建的用于listen的socket描述符。  
  2.  * 参数:addr  这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址  
  3.  * 参数:len 描述 addr 的长度  
  4.  */ 
  5. int accept(int sockfd, struct sockaddr* addr, socklen_t* len)  
  6.  

    accept函数主要用于服务器端,一般位于listen函数之后,默认会阻塞进程,直到有一个客户请求连接,建立好连接后,它返回的一个新的套接字 socketfd_new ,此后,服务器端即可使用这个新的套接字socketfd_new与该客户端进行通信,而sockfd 则继续用于监听其他客户端的连接请求。

    至此,我的困惑产生了,这个新的套接字 socketfd_new 与监听套接字sockfd 是什么关系?它所代表的socket对象包含了哪些信息?socketfd_new 是否占用了新的端口与客户端通信?

    先简单分析一番,由于网站的服务器也是一种TCP服务器,使用的是80端口,并不会因客户端的连接而产生新的端口给客户端服务,该客户端依然是向服务器端的80端口发送数据,其他客户端依然向80端口申请连接。因此,可以判断,socketfd_new 并没有占用新的端口与客户端通信,依然使用的是与监听套接字socketfd_new一样的端口号。

    那这么说,难道一个端口可以被两个socket对象绑定?当客户端发送数据过来的时候,究竟是与哪一个socket对象通信呢?
 
    我是这么理解的(欢迎拍砖)。

    首先,一个端口肯定只能绑定一个socket。我认为,服务器端的端口在bind的时候已经绑定到了监听套接字socetfd所描述的对象上,accept函数新创建的socket对象其实并没有进行端口的占有,而是复制了socetfd的本地IP和端口号,并且记录了连接过来的客户端的IP和端口号。

    那么,当客户端发送数据过来的时候,究竟是与哪一个socket对象通信呢?

    客户端发送过来的数据可以分为2种,一种是连接请求,一种是已经建立好连接后的数据传输。

    由于TCP/IP协议栈是维护着一个接收和发送缓冲区的。在接收到来自客户端的数据包后,服务器端的TCP/IP协议栈应该会做如下处理:如果收到的是请求连接的数据包,则传给监听着连接请求端口的socetfd套接字,进行accept处理;如果是已经建立过连接后的客户端数据包,则将数据放入接收缓冲区。这样,当服务器端需要读取指定客户端的数据时,则可以利用socketfd_new 套接字通过recv或者read函数到缓冲区里面去取指定的数据(因为socketfd_new代表的socket对象记录了客户端IP和端口,因此可以鉴别)。

    这就是我对socket编程的一些疑问的理解,有不正确的地方欢迎留言或者来信lujun.hust@gmail.com交流。 

本文出自 “对影成三人” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/779866

H3C R4900 G3 服务器配置raid与BIOS固件升级方式 BIOS中配置raid1 h3c服务器HDM默认地址为192.168.1.2 使用浏览器打开192.168.1.2 选择远程控制,使用H5 KVM远程 因为服务器没有装系统开机后找不到系统会出现这个界面,也可以在开机时初始化后按DEL或者Esc键进入BIOS界面 进入BIOS后上面菜单选择advanced-- 找到服务器阵列卡H460-M1,回车进去 选择Array configuration 选择Create Array 找到要使用做raid的硬盘把disabled改为enabled 这里演示的 阅读详情

相关推荐

华三(H3C)HDM服务器硬件监控指标解读

监控易作为一款专业的监控软件,通过集成H3C HDM技术,为运维团队提供了全面的服务器硬件监控解决方案。通过对监控易中华三H3C HDM监控指标的解读,我们可以看到监控易为运维团队提供了全面而细致的服务器硬件监控解决方案。通过合理设置和应用这些监控指标,运维团队可以及时发现潜在问题并采取相应的处理措施,确保服务器的稳定运行和业务连续性。通过集成各种监控技术和协议,监控易能够实时收集和分析IT系统的运行状态和性能指标,帮助运维团队及时发现潜在问题并进行处理。

MXsoft618的博客 2009

socket Accept()

先给出一个典型的TCP/IP通信示意图。       问题一:socket结构体对象究竟是怎样定义的?     我们知道,在使用socket编程之前,需要调用socket函数创建一个socket对象,该函数返回该socket对象的描述符。 函数原型:int socket(int domain, int type, int protocol);      那么,这个sock

莫轩空 1111

H3C R4900 G3服务器RAID1配置全流程:从BIOS设置到HDM固件升级避坑指南

本文详细解析了H3C R4900 G3服务器配置RAID1阵列并升级HDM及BIOS固件的完整流程。内容涵盖从前期硬件核查、BIOS设置创建RAID1,到执行固件升级的关键步骤与风险规避,重点提供了官方文档未详述的实战避坑指南,旨在帮助运维工程师安全、高效地完成服务器存储配置与系统维护。

bash7scripter的博客 957

socket编程之accept()

accept()入门到精通

qq_55537010的博客 3820

手把手教你用H3C官方渠道下载R4900 G3最新固件:BIOS/HDM双升级实战教程

本文详细介绍了H3C R4900 G3服务器固件升级的全流程,包括BIOS和HDM双升级的实战教程。从官网下载最新固件到安全刷写,提供了详细的步骤和注意事项,帮助企业IT人员高效完成服务器维护,提升硬件兼容性和性能表现。

spice的博客 964

H3C R4900 G3 BIOS与HDM固件升级避坑指南:生产环境必看

本文为H3C R4900 G3服务器在生产环境中进行BIOS与HDM固件升级提供了全面的避坑指南。文章深度解析了从风险预判、版本兼容性核查、配置备份,到HDM与BIOS固件升级的精细化操作流程及应急回退方案,旨在帮助运维人员规避RAID配置异常、升级失败等风险,确保关键业务服务器的升级过程平滑、安全。

win55的博客 925

Java的accept()

在Java中,accept()方法通常与网络编程中的套接字(Sockets)相关联,尤其是在服务器端的类中。accept()方法用于等待并接受到来的连接请求。当一个客户端尝试与服务器建立TCP连接时,如果服务器端的正在监听指定的端口,那么accept()方法就会建立连接,并返回一个新的Socket对象来与客户端进行通信。下面是accept()

weixin_63490470的博客 1965

H3C R4900 G3服务器RAID1配置实战:从零到阵列搭建的完整流程

本文提供了H3C R4900 G3服务器配置RAID1阵列的完整实战指南。内容涵盖从服务器初始化、通过HDM管理界面进行前期检查,到深入BIOS与阵列卡配置工具创建RAID1的详细步骤。同时,文章还分享了关键的HDM与BIOS固件升级策略及常见问题排查方法,旨在帮助IT管理员和工程师高效、安全地完成服务器存储基础配置。

pca5navigator的博客 639

socket编程:accept()函数详解

文章目录1. 函数原型2. 函数使用3. 参数4. 通过函数也可以得到客户端信息5. 得到本地服务器信息6. 返回值 官方文档:https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept 1. 函数原型 accept函数允许在套接字上进行传入连接尝试。 SOCKET WSAAPI accept( SOCKET s, sockaddr *addr, int *addrlen ); li

超级大洋葱的博客 3万+

Zabbix自动发现并监控H3C系列服务器(通过HDM口获取数据)

由于公司机房距离较远,导致无法直接知道服务器的健康状态、CPU、温度、电源等信息。于是便有了这篇实验,获取信息的方式跟网络设备基本一致,都是通过SNMP协议,唯一与网络设备不同的是服务器只能通过带外管理口才能获取数据而网络设备则任意端口都可以。需要注意的是配置Zabbix模板时必须关联与HDM版本一致的模板,或者根据H3C官网(HDM 1.11.32P01 版本软件及版本说明书-新华三集团-H3C)指示,将HDM版本更至最新。目前已经可以获取到服务器的信息了,可以通过最新数据来做可视化图形。

Pangpangbupang. 2607

Python量化投资入门教程:从零构建你的第一个交易策略

量化投资教程以数学模型和计算机程序实现超额收益,选用Python工具链完成数据获取、策略构建及回测。通过移动平均线交叉策略示例,展示数据预处理、信号生成、收益计算及可视化全流程,结合收益率、最大回撤和夏普比率评估策略,并建议参数优化与策略融合提升稳健性。

ylmx5201314的博客 2454

H3C服务器修改HDM密码,H3C服务器配置HDM远程管理系统

HDM(H3C Device Management,H3C设备管理)系统是H3C UIS服务器的一个标准组件,通过它可以简化服务器初始设置、监控服务器运行状况、优化电源和散热系统以及对服务器进行远程管理等。HDM系统依靠智能微处理器、专用内存和共享网络接口等技术,实现HDM独立于主机服务器及其操作系统。H3C服务器默认是DHCP自动获取地址。然后在浏览器里面输入IP地址和缺省的用户名和密码就可以登...

weixin_42552124的博客 5787

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 261

h3c服务器r4900清空配置信息,H3C R4900 G3服务器HDM初始化配置

H3C R4900 G3出厂设置HDM专用口默认IP:192.168.1.2,默认用户名:admin,默认密码:Password@_服务器安装以后需要根据实际情况修改HDM IP。如果一台一台的修改会比较繁琐,现场交付时大多使用Windows笔记本电脑,使用批处理制作了快速配置脚本。将笔记本电脑的网口和HDM 专用口直连就可以进行快速的配置。可进行的配置包括1、根据实际需求的HDM用户和密码2、修...

weixin_33831334的博客 5561

GStreamer Plugin之Gst-nvdewarper

支持三种投影类型 NVDS_META_SURFACE_FISH_PUSHBROOM, NVDS_META_SURFACE_FISH_VERTCYL 和NVDS_META_SURFACE_PERSPECTIVE_PERSPECTIVE。关于每个平面的NvDewarperSurfaceMeta参数(projection_type, surface_index, and source_id)以及内存中有效的矫正平面(num_filled_surfaces)包含RGBA格式的一帧的缓存。矫正后的RGBA格式。

pvmsmfchcs的博客 366

华三服务器管理口地址_H3C服务器配置HDM远程管理系统

HDM(H3C Device Management,H3C设备管理)系统是H3C UIS服务器的一个标准组件,通过它可以简化服务器初始设置、监控服务器运行状况、优化电源和散热系统以及对服务器进行远程管理等。HDM系统依靠智能微处理器、专用内存和共享网络接口等技术,实现HDM独立于主机服务器及其操作系统。H3C服务器默认是DHCP自动获取地址。然后在浏览器里面输入IP地址和缺省的用户名和密码就可以登...

weixin_39736007的博客 1万+

GMSL转eDP芯片MAX9686X(ADI)

MAX96860/MAX96862/MAX96864解串器可以把单路或双路GMSL转换成eDP V1.4a,支持820MHzPCLK的无压缩的24bpp(每个像素的位数)视频,或660MHz的30bpp视频。芯片的GMSL支持NRZ编码的6Gbps/187Mbps的GMSL2,PAM4编码的12Gbps/187Mbps的GMSL3。同时支持单线(COAX模式)双向全双工传输控制数据和video数据。支持DSC压缩的芯片,最大支持像素时钟1080MHz@24bpp或者864MHz@30bpp,传输方式包括同轴

qflook的博客 2837

服务器智能管理系统简单总结(华为的iBMC/DELL的iDRAC/浪潮的BMC/联想IBM的IMM口/H3C的HDM口)

最近上架了几台不同厂家的服务器,对比下后台的管理系统给大家看看,也以便方便自己以后查阅。 1.华为的iBMC:默认地址192.168.2.100 账号密码:Administrator/Admin@9000,A都是大写的,区分大小写。 2.DELL的iDRAC:默认IP地址192.168.0.120 账号密码:root/calvin 新款的服务器是有安全密码,默认密码无法登录,根据下边的图片可以使用手机扫描二维码获取,每个服务器的密码都不一样。 3.浪潮服务器的BMC默认地址:10.0.100.5会有差.

aalmost的博客 2万+

ResNet改进(7):添加 SK注意力机制

实现 SK 注意力机制。

2401_82355416的博客 731

解锁轻量化网络实验室:在 Containerlab 中部署 Cisco IOL 设备的详细教程

Cisco IOS On Linux(IOL)是 Cisco IOS-XE 的简化版,它是 Cisco IOS 的一种轻量级实现。IOL 并不需要完整的虚拟机(Virtual Machine, VM)环境,可以直接在 Linux 上运行,极大地减少了对系统资源的需求。IOL 节点通过更精简的方式提供了 Cisco IOS 功能,适合构建实验室、测试网络协议和验证网络设计。

网络技术联盟站 476

H3C R4900 G2服务器通过HDM安装系统

H3C R4900 G2服务器通过HDM安装系统 H3C R4900 G2服务器通过HDM安装WINSERVER2008R2SP1系统 H3C R4900 G2服务器支持的操作系统http://www.docin.com/p-2063082350.htmlH3C R4900 G2服务器做Raid参考http://www.h3c.com/cn/d_201707/1016095_30005_0.htm...

weixin_34303897的博客 1万+

总结目前开源的视频生成/视频编辑大模型

随着Sora的爆火,视频生成和视频编辑受到了越来越多的关注。这篇博客总结一下目前开源的视频生成和视频编辑的大模型,并分析他们各自的优缺点,以及在自己进行科研任务或者工作中应该如何选用对应的开源模型,希望能给从事这一领域研究和使用的小伙伴们帮助。

沉迷单车的追风少年 3542

华三服务器HDM打不开网页,H3C服务器配置HDM远程管理用户指南_5分享文库

HDM(H3C Device Management,H3C 设备管理)系统是 H3C UIS 服务器的一个标准组件,通过 它可以简化服务器初始设置、监控服务器运行状况、优化电源和散热系统以及对服务器进行远程管 理等。HDM 系统依靠智能微处理器、专用内存和共享网络接口等技术,实现 HDM 独立于主机服务 器及其操作系统。1 HDM简介 ························ 1-1...

weixin_28921115的博客 2538

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

H3C服务器修改启动项,H3C服务器 iFIST快速安装指南-6W102

(1)从H3C网站获取最新版本的iFIST镜像文件。(2)将包含有iFIST镜像文件的安装介质(当前仅支持物理光盘和虚拟光盘)挂载到服务器,并引导该介质。需要注意的是,请确保服务器只挂载了一个可引导的安装介质,否则可能导致引导项识别错误,以致于安装iFIST失败。(3)选择iFIST更新方式,开始更新。(4)更新完成后,重启服务器。(5)检查更新后...

weixin_39676979的博客 7533

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华三服务器怎样用hdm安装linux,H3C服务器配置HDM用户指南

HDM(H3C Device Management,H3C 设备管理)系统是 H3C UIS 服务器的一个标准组件,通过 它可以简化服务器初始设置、监控服务器运行状况、优化电源和散热系统以及对服务器进行远程管 理等。HDM 系统依靠智能微处理器、专用内存和共享网络接口等技术,实现 HDM 独立于主机服务 器及其操作系统。1 HDM简介 ························ 1-1...

weixin_31147757的博客 3825
上一篇: 谈谈RTP传输中的负载类型和时间戳
下一篇: linux下用C编写的基于smtp的带附件邮件发送程序
horst_hu
博客等级 码龄15年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值