IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:socket

共 20 篇相关文章

IT 累计浏览 2,567

Golang socket 里面奇怪的 pipe 使用

这篇讲的是一个Go语言代理服务器在排查文件描述符时遇到的蹊跷事。 作者日常监控发现,一个TCP连接数两万多的服务,在系统的`/proc/pid/fd`目录下却有五万多个pipe文件描述符,数量远超socket本身。这不符合直觉,于是开始深挖源码。 根因最终指向了Go在Linux下对`net.Conn.readFrom`方法的优化。为了减少用户态内存拷贝,Go会尝试使用`splice`系统调用在内核态直接完成数据传输。而`splice`要求一方必须是管道,因此其实现略显“绕”:每次`readFrom`操作都会先通过`pipe2`创建一对临时管道,再分别进行`splice`操作,用完即关。这完美解释了那些额外pipe的来源。 作者也指出,尽管这种“管道中转”的实现看起来不甚优雅,但在像代理这样`readFrom`生命周期较长的场景中,其性能收益依然可观,因此通常无需优化。文章通过一次具体的生产现象,清晰揭示了Go网络库中一个精巧但隐蔽的内核级优化机制。

IT 累计浏览 1,929

如何hook一个系统调用

这篇讲的是如何通过hook系统调用来定位一个隐蔽的bug。作者从一个具体问题出发:他们使用的某个库会断言socket的文件描述符必须大于0,但系统运行一段时间后这个断言会失败,意味着有人错误地关闭了标准输入(fd=0)。 面对这个难题,作者没有选择在每个close调用处手动添加日志(工作量大且易遗漏),而是利用了Linux下动态链接的一个精妙特性:`LD_PRELOAD`。文章详细展示了如何编写一个名为`my_close.c`的共享库,在其中重新定义`close`函数。这个函数会先检查传入的fd是否为0,如果是则直接让程序崩溃(coredump),否则通过`dlsym`获取并调用原始的`close`函数。 通过设置`LD_PRELOAD`环境变量指向这个自定义库,程序在运行时就会优先加载它,从而劫持所有的`close`调用。这样,一旦程序中有代码试图关闭标准输入,就能立刻被定位到。整个过程巧妙地利用了系统机制,将原本需要大范围排查的问题,转化为了一个精准的触发点,是调试动态库和大型程序时一个非常实用的技巧。

IT 累计浏览 2,971

socket消息流程介绍及其C代码实现

这篇讲的是如何用C语言完整实现一个Linux下的TCP服务器,清晰地展示了socket通信从创建到结束的全过程。作者通过一个具体的程序示例,逐步拆解了socket编程的核心流程:首先创建socket并绑定指定的IP与端口,其中还设置了SO_REUSEADDR选项来处理端口复用;接着启动监听,循环接受客户端连接;最后接收指令、执行操作并返回结果。代码中对每个环节都加入了错误处理和状态反馈,使得流程健壮且逻辑清晰。文末还附上了makefile编译脚本和通过工具测试的运行结果,让读者能直观地看到“发送-接收-响应”的完整交互。对于想要理解底层网络编程细节的开发者来说,这篇从代码到理论再到实践的梳理,提供了一个非常扎实的参考范例。

IT 累计浏览 4,015

手机应用/服务器开发的一些总结(二)

这篇讲的是自定义TCP socket开发中的实践经验与方案对比。作者从Android客户端和服务器端两个维度展开,重点讨论了阻塞与非阻塞socket的选型及具体实现中的“坑”。 Android端部分,作者对比了传统阻塞socket与NIO的使用差异,特别分享了NIO在实际业务中遇到的问题。例如网络断线时`finishConnect()`可能长时间阻塞,解决方案是通过`setSoTimeout`设置合理超时。同时也指出了NIO下`channel.read`不同返回值(如-1表示关闭、0表示无数据)的准确含义,这些细节对稳定开发至关重要。 Server端部分,作者分析了从Python标准库`ThreadingTCPServer`到异步框架tornado与gevent的演进。他指出,tornado的异步IO虽然性能高,但业务代码不能阻塞,使用起来有一定痛苦;而gevent则兼顾了性能与编码便利性。基于此,作者还封装了`tkola`和`gkola`两个库,采用类似Flask的装饰器风格来简化TCP server开发,并提供了清晰的代码示例。 总的来说,文章不仅梳理了不同场景下的技术选型逻辑,更分享了生产环境中的具体解决方案与开源工具,对从事移动端与服务器网络编程的开发者有较强的实用参考价值。

IT 累计浏览 4,168

TCP网络协议以及其思想的应用

这篇深入探讨了TCP协议核心思想的文章,跳出了单纯的网络协议讲解,聚焦于如何将TCP在不可靠网络上构建可靠传输的智慧,活用到更广泛的系统设计中。 作者从大多数程序员对TCP的熟悉但未必精通的状态切入,明确指出TCP的精髓是在IP层的不可靠传输之上建立可靠机制。其核心技术如滑动窗口、慢启动、指数退避等,目的都是优化传输。但更重要的,是它提供的设计范式。 文章强调,TCP的“可靠”是相对自身协议栈而言的,一旦跨越不同系统边界(比如从一个应用到另一个应用),就需要重新审视可靠性。因此,任何涉及通信与交互的场景,都可以借鉴TCP的思想。 作者提炼出了在任何通信系统之上构建可靠传输所必须的三要素:确认、重传和顺序。这为我们设计自定义可靠协议(例如在UDP之上)或解决复杂交互问题,提供了清晰且根本的思路。

IT 累计浏览 3,884

回调还是消息队列

这篇文章从作者封装Hive socket库时遇到的一个具体问题切入:如何处理底层`poll` API产生的事件。直接注入回调函数虽然直接,但容易引发异常、重入等不可控问题,且会加剧C/Lua边界的性能负担。 作者提出的方案是将事件及数据一次性返回给Lua层处理。为优化此方案可能带来的GC压力,他采用了一个预先传入的消息队列(一个空的Lua table)作为接收结构。在C层,通过高效的`rawseti`操作将消息逐条写入这个结构,并巧妙地利用一个缓存池来复用存储每条消息参数的小table,从而在系统稳定后避免了临时构建大型Lua表。 文章最后,作者还附上了一段极简的Lua消息队列实现代码,展示了其优雅的实现思路。整体而言,文章分享了一个从具体问题出发,在性能与可控性间权衡并最终优化实现的技术决策过程。

IT 累计浏览 10,838

推荐一些socket工具,TCP、UDP调试、抓包工具

作者从Fiddler和Charles这些HTTP调试神器聊起,引出了对socket及TCP/UDP调试工具的需求。文章没有停留在理论,而是直接推荐了几款作者亲测的实战工具,并点明了它们各自的长处。 Wireshark依然是底层抓包分析的王者,但文章特意提醒了它可能按端口号自动解码协议带来的小烦恼。而国产工具sokit则更像一把“瑞士军刀”,作者重点介绍了它基于QT的跨平台特性、方便的二进制包组装能力,以及模拟分包/粘包和轻量级抓包的实用功能,甚至分享了自己曾因一个空格导致发送数据异常的真实小故事,这恰恰凸显了详细日志的重要性。 除此之外,文章还对比了体积小巧的TCP/IP Builder,以及能直观监控系统所有连接、帮助排查异常进程的Windows工具TCPView。整体来看,这篇推荐就像一份从实战出发的工具清单,帮助开发者根据具体场景——是深度抓包分析、快速调试协议,还是监控连接状态——选择最顺手的兵器。

IT 累计浏览 8,827

推荐一些socket工具,TCP、UDP调试、抓包工具

这篇讲的是作者从自己推荐HTTP调试工具的过往经验出发,引出了对Socket、TCP/UDP调试及抓包工具的系统推荐。作者作为一名“工具控”,不仅介绍了像Wireshark这样公认的网络抓包神器——它功能强大但偶尔会“自作聪明”地按端口号解码协议,也重点安利了一款国人开发的跨平台工具sokit,它能方便地模拟分包粘包,支持客户端、服务器、代理三种模式,不过作者也分享了一个在发送二进制数据包时因空格导致发送异常的小坑。 文章还列举了TCP/IP Builder、TCPView等其他几款各有侧重的工具。其中,TCPView尤其适合用于监控系统当前的TCP/UDP连接状态,甚至能帮助排查一些异常连接。作者最后也坦言,对于简单的调试需求,自己动手写脚本同样便捷。 这些工具基本覆盖了从数据包捕获、协议分析到连接状态监控的常见场景,适合在不同环节辅助开发者进行Socket通信的调试与排查。

IT 累计浏览 2,932

Perl 实现 Flash 的 Socket Policy 服务器

这篇讲的是作者从一个误解出发,折腾出一个轻量解决方案的实践经历。起初,为了支持Flash P2P功能的测试,作者需要提供Socket策略文件。他最初错误地以为只需用HTTP服务器响应,直到被合作方提醒,才明白Flash Player的机制:在建立Socket连接前,它会主动向服务器的843端口发送一个 `` 字符串以请求策略文件。 理解了这个机制后,作者利用Perl的AnyEvent框架,仅用几分钟就实现了一个TCP服务器来响应这个请求。核心代码展示了AnyEvent::Handle的强大:它让服务器可以简洁地监听连接,并依据自定义规则(此处是收到特定字符串)进行读写。收到请求后,服务器直接返回预设的 `crossdomain.xml` 内容并主动断开连接,完美符合协议要求。作者也借此引出了AnyEvent在快速构建高性能TCP服务上的便利性。 文章最后,作者提到自己后来发现GitHub上已有类似实现,相当于“重复造了个轮子”。但整个过程清晰地记录了问题排查、机制理解和代码实现的完整链条,对需要处理类似Flash Socket安全策略的开发者,是一个直接而有用的参考。

IT 累计浏览 6,731

浅析linux kernel network之socket创建

作者从Linux内核网络子系统的一个基础但关键的环节——socket对象的创建——出发,梳理了用户空间系统调用到内核数据结构初始化的完整路径。这篇文章并非泛泛而谈,而是聚焦于`sys_socket`入口之后,内核如何通过socket操作集(`proto_ops`)找到对应的协议族(如IPv4),再进一步匹配具体的传输层协议(如TCP)并创建核心的`sock`对象。 其精妙之处在于揭示了这一过程清晰的分层与解耦:从通用的socket层,到特定的协议族层,再到具体的传输层,每一步都通过函数指针表进行动态绑定。作者对`sock`结构体初始化的分析,尤其是协议操作集(`sk_prot`)与socket操作集如何被赋值和关联,让读者能直观理解内核如何为后续的数据收发构建好必要的“骨架”。 对于想了解网络协议栈内部构造的读者,这篇文章提供了一个扎实的起点,它将抽象的“创建连接”动作,拆解成了内核中一系列具体而有序的函数调用与结构体填充,为后续探索数据包的处理流程打下了基础。

IT 累计浏览 1,725

mysql_connect报告”No such file or directory”错误的解决方法

这篇讲的是在Mac MacBook Pro上安装WordPress时遇到的一个经典坑:PHP脚本调用`mysql_connect()`连接本地数据库时,竟然报出“No such file or directory”的错误。作者首先排除了数据库服务器本身的问题,因为MySQL命令行客户端可以正常工作,这让人很困惑——连接数据库怎么还和“文件”扯上关系了? 问题的根源其实非常隐蔽且具有平台特异性。在macOS和某些Linux环境下,PHP的`mysqli`扩展默认尝试通过Unix socket连接MySQL,而非TCP/IP。这个socket文件的具体路径(比如`/tmp/mysql.sock`或`/var/mysql/mysql.sock`)在不同系统或安装方式下可能不一致,如果PHP配置的路径与MySQL服务器实际创建socket的路径不匹配,就会报这个看似不相关的文件系统错误。 文章的解决步骤清晰且具有实操性:通过phpinfo()查看当前PHP的socket路径配置,再定位MySQL服务器实际的socket文件位置,最后在`php.ini`或代码中通过`mysqli.default_socket`参数将其统一。这个案例典型地展示了环境配置中“默认值不一致”带来的陷阱,对于在本地搭建开发环境的PHP开发者尤其有参考价值,能避免在排查连接问题时走入死胡同。

IT 累计浏览 3,937

Linux下方便的socket读写查看器(socktop)

这篇文章介绍了一个名为 socktop 的实用工具,用于解决一个非常具体的排查痛点:在 Linux 环境下观测 Unix 域套接字(Unix domain socket)的数据流。作者从实际工作中的需求出发——同事需要确认两个程序间是否通过 Unix 域套接字成功收发了消息,但常用的网络抓包工具如 tcpdump 和 Wireshark 对此无能为力。文章随后引出了解决方案:socktop 是一个轻量级的诊断工具,能够实时监听并展示指定套接字上的读写操作与数据,让原本“不可见”的进程间通信变得清晰可查。 内容不仅指出了问题所在,还直接给出了工具的使用场景和核心价值,对于需要进行本地 IPC 问题排查的开发者和运维人员来说,提供了一个即学即用的利器。文章的叙述平实而聚焦,从一个真实的问题切入,最终交付了一个具体的、可落地的技术方案。

IT 累计浏览 4,775

为flash建立socket安全策略文件服务器

这篇文章探讨了Flash socket通信中的安全策略文件服务器部署方案。作者从Flash强大的网络功能切入,指出一个关键矛盾:Flash允许通过TCP连接与服务器交换数据,但这意味着外部服务器可能借此穿透到内网,带来严重的安全隐患。为了解决这一问题,Flash引入了安全策略文件(crossdomain.xml)机制。 文章的核心方案围绕如何正确搭建和配置策略文件服务器展开。它解释了策略文件如何作为“安全握手”的一部分,在Flash客户端发起实际Socket连接前,先向指定端口请求该文件,以此声明允许哪些域访问本地资源。作者详细说明了策略文件的语法结构,以及服务器端必须确保在端口843监听并及时返回该文件,否则连接将被拒绝。 这篇内容并非简单介绍概念,而是深入到实施细节。它强调,忽略策略文件服务器的正确配置,是开发者经常遇到连接失败的根源。对于需要实现富网络交互的Flash应用开发者而言,理解这一机制是确保功能正常与系统安全平衡的关键一步。

IT 累计浏览 4,543

node.js调研与服务性能测试

这篇讲的是作者对Node.js进行的初步调研与实践性能测试。他从Node.js的非阻塞I/O和事件循环机制入手,搭建了典型的Web服务模型进行压测。测试环境配置了不同的并发连接数,观察其CPU与内存的消耗曲线。 关键发现在于,面对I/O密集型任务,Node.js的吞吐量表现优异,资源占用相对平稳;但在计算密集型场景下,单线程模型会成为瓶颈,CPU使用率会迅速飙升。作者通过具体的压测数据(比如每秒请求数和响应延迟)展示了这一特点。 文章最后基于测试结论,归纳了Node.js更适合API网关、实时推送等场景,而对于需要大量CPU运算的服务,则需要谨慎评估或采用多进程架构。

IT 累计浏览 2,430

基于PHP的pcntl扩展的Mpass介绍

这篇讲的是如何让原本只负责业务逻辑的PHP,也能“挑起大梁”来提供Socket服务。作者从实际业务场景出发,面对PHP传统上不擅长做服务端,但代码资产又全是PHP的两难困境,引出了基于PHP pcntl扩展的Mpass解决方案。 核心思路是利用pcntl的多进程能力来管理Socket连接与处理。文章具体介绍了Mpass如何通过主进程监听端口、派发Worker子进程处理客户端请求的架构,从而绕过PHP单线程的限制。这种设计在保持原有PHP业务代码不变的前提下,为其赋予了高性能服务端的能力,特别适合需要快速整合历史逻辑的服务化场景。对于遇到类似技术栈转型难题的开发者,这提供了一个直接可用的参考路径。

IT 累计浏览 3,152

dfopen():discuz封装的fsockopen()

这篇讲的是Discuz论坛系统中一个非常实用的HTTP请求函数——`dfopen()`的源码实现。作者从PHP内置的`fsockopen()`函数出发,展示了如何将其封装得更友好、更易用。 `dfopen()`的核心思路是手动构造HTTP请求报文。函数首先解析目标URL,提取主机、路径和端口,然后根据是否传递了`$post`参数,自动生成GET或POST请求头。这些请求头包含了User-Agent、Cookie等常见字段,使得模拟浏览器请求更加便捷。更巧妙的是,它还集成了对阻塞/非阻塞模式的设置以及超时控制。 在数据传输环节,函数通过`stream_set_blocking`和`stream_set_timeout`精细管理连接状态,并采用循环读取的方式处理响应,同时支持通过`$limit`参数限制返回数据的大小,这对于处理可能的大体积响应非常有用。最后,它还会检查连接是否超时,并在读取完成后自动关闭连接。 整个封装将原本需要手动拼装请求头、管理连接生命周期的繁琐操作,简化为一个函数调用。这不仅方便了Discuz系统内部进行跨站数据交互(如登录同步、数据采集),也为我们理解PHP底层网络编程提供了一个简洁清晰的范例。

IT 累计浏览 5,021

php socket为什么这么慢,直到超时

作者在一次模拟HTTP请求时遇到了PHP socket异常缓慢的问题,直到超时才停止。这个问题起初让他困惑不已,因为 socket 操作在逻辑上似乎并无不当之处。 问题的根源最终被追溯到对 HTTP 协议细节的忽视上。在模拟请求的过程中,某些与 HTTP 协议约定相关的处理环节被忽略了,而这些恰恰是 socket 通信能够正确且高效完成请求的前提。这种疏忽直接导致了 socket 连接在底层“卡住”,直到达到超时限制。 作者事后复盘,称之为一次“血淋淋的教训”。他反思道,在进行底层网络编程时,深入理解上层应用协议(如 HTTP)的规范和细节至关重要,而不能仅仅满足于让代码在表面上“能跑通”。这篇分享正是源于这次深刻的踩坑经历,它提醒开发者,看似是底层 socket 的性能问题,答案可能藏在对更上层协议的严谨处理之中。

IT 累计浏览 6,332

python中的socket代理

这篇讲的是Python中Socket代理的实现与适用场景。作者从Python自带的HTTP代理功能说起,指出urllib2等库虽能便捷设置HTTP代理,但面对更底层的网络通信需求,就需要转向Socket代理。文章对比了两者的核心差异:HTTP代理工作在应用层,主要处理特定协议的请求转发;而Socket代理则在传输层提供通用代理能力,能处理TCP/UDP等更广泛的流量。 这种底层特性使得Socket代理在需要代理原生TCP连接、开发自定义网络工具或进行特定协议穿透时成为必要选择。文中通过代码示例与原理说明,揭示了Socket代理如何通过监听和转发原始数据包来实现这一过程,并探讨了其在实际开发中的典型应用。 对于需要处理非HTTP协议或追求更高控制自由度的开发者而言,理解Socket代理的实现机制能帮助他们在项目中做出更合适的技术选型。

IT 累计浏览 3,294

C#网络通信中中文字符的传送以及SQL数据库存取中文的解决方法

这篇讲的是一个在C#网络编程和数据库操作中非常经典的“坑”:中文乱码。作者从Socket通信的场景切入,描述了一个常见现象——当直接发送包含中文的字符串时,接收端看到的往往是一堆毫无意义的乱码。其核心原因在于,默认的字符串处理方式没有正确统一编码格式。 文章详细拆解了问题的根源与解决方案。它指出,必须在数据发送前和接收后,明确统一地采用像UTF-8这样的通用编码进行字节转换。这个原则同样适用于操作SQL数据库存取中文数据的场景,即连接字符串中指定正确的字符集。作者不仅给出了具体的编码处理代码示例,还延伸讨论了在不同开发环节(如Socket通信、数据库连接、文件读写)中保持编码一致的重要性。 对于经常处理多语言数据或从事网络应用开发的程序员来说,这篇文章厘清了编码混乱这个隐蔽却频繁出现的问题,提供了从原理到实践的完整解决路径。掌握其中的方法,能有效避免后续开发中不必要的调试时间。

IT 累计浏览 5,531

netstat和web主机socket文件分析

这篇讲的是如何通过netstat命令和系统socket文件来分析Web主机的网络状态。作者从一次服务器响应变慢的实际排查经历出发,详细展示了在Linux环境下,如何使用netstat -tunlp快速列出所有监听端口及对应进程,并重点解读了ESTABLISHED、TIME_WAIT等关键状态连接数的含义。文章还进一步带读者进入/var/run/目录,分析了像nginx、mysql这类服务生成的sock文件,解释了Unix domain socket与网络socket的区别及其在进程间高效通信中的应用场景。 通过对比netstat提供的实时网络连接视图与socket文件揭示的进程间通信路径,文章清晰地勾勒出排查Web服务端口冲突、连接泄漏或进程僵死等问题的具体步骤。例如,当发现某个端口被意外占用,或大量TIME_WAIT堆积时,如何定位到具体的进程ID并采取相应措施。这种将标准命令行工具与底层文件系统观察相结合的思路,为系统管理员和后端开发者提供了一套实用且深入的诊断方法论。