linux下网络编程常见问题

网络程序异常退出无core文件产生

这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core。为了避免退出,一般在启动的时候加上 signal(SIGPIPE, SIG_IGN) 来忽略这种错误。

发送端send成功,但是接收端却recv失败

send只是表示数据copy到了发送缓冲区,并不代表数据到达了recv,若这时候网络出问题,对面确实收不到数据。

如何让接受方知道发送方每次发送的数据有多长

两种方式

1. 和ip协议类似在每段发送的数据前拼接一个固定长度的包头,包头里存储数据长度类型等信息,接受方那边recv2次,第一次收包头,第二次根据包头里的长度申请空间收数据

2. 和http包头类似,已特殊标记符号为结尾,http是2个\r\n

服务端地址重用问题

服务端重启会被告知端口被占用,这是因为服务端主动调用了close操作。主动断开连接方的端口会在断开以后短时间处于TIME_WAIT状态,这时候端口不能被重用,解决办法是在setsockopt函数里面设置SO_REUSEADDR来保证地址的重用。

为什么会出现TIME_WAIT

四次挥手过程中,主动断开方收到对面的fin包以后要反发一个ack包回复(这是第四次挥手),发完ack以后要等待2个TIME_WAIT(60S)时间才关闭自己,原因是因为ack包会出现丢包的情况,如果出现,对面由于没收到ack可能又会重发fin包,而ack—>fin这一来一回的最长时间正好是2个TIME_WAIT时间,所以主动断开方在等待2个TIME_WAIT时间以后没收到fin就说明ack包已经正常到底对面连接

CLOSE_WAIT状态出现在什么时候

被动关闭方收到对面的fin包以后到发送自己的fin包这段时间网络会处于 CLOSE_WAIT状态,不过这段时间比较短,除非是自己这边网络异常不能关闭连接。

listen的backlog设置

listen里面维护2个队列,一个是已经连接完成的队列,这个长度为backlog,一个是未完成连接的队列,这个长度为backlog/2,accept取的是已完成队列里的句柄,如果accept取的不及时可能导致队列满,这样listen就会拒绝连接

时间: 2024-10-10 23:28:14

linux下网络编程常见问题的相关文章

linux下网络编程学习——入门实例ZZ

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

linux下网络编程学习——入门实例

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

Linux下网络编程学习杂记

1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)->网络层->网络接口层(负责将二进制流转换成数据帧,并进行数据帧的发送和接收)->硬件层. 2.服务器是指能在网络上提供服务的任何程序:客户机是指用户为了得到某种服务所需运行的应用程序. 3.网络通信即为进程间的通信,套接口就是网络进程的ID.使用端口号和网络地址的组合能够唯一确定整个网路中的一个

【转】网络编程常见问题总结

网络编程常见问题总结 这里对在网络程序中遇到的一些问题进行了总结, 这里主要针对的是我们常用的TCP socket相关的总结, 可能会存在错误, 有任何问题欢迎大家提出. 对于网络编程的更多详细说明建议参考下面的书籍 <UNIX网络编程> <TCP/IP 详解> <Unix环境高级编程> < div> 网络编程常见问题总结 相关说明 非阻塞IO和阻塞IO 基本概念 设置 区别: 读: 写: 超时控制: 长连接和短连接的各种可能的问题及相应的处理 短连接: 长

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下Socket编程的端口问题( Bind error: Address already in use )

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

linux socket网络编程 常用函数及头文件

转自:http://blog.chinaunix.net/u3/102500/showart_2065640.html 一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_DGRAM) 提供无连接的数据传输服务,不保证可靠性. 3.原始式套接字(SOCKET_RAW) 该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

Linux 下互联网络编程的基础知识

2019-10-07 关键字:Linux 网络编程基础 TCP/IP 协议里有两种不同的协议: 1.TCP协议 用于检测网络传输中的差错. 2.IP协议 用于对不同网络进行互联. 简单说就是 TCP 负责纠错,IP 负责传输. 网络体系结构: 网络体系结构就是将复杂的网络通信过程按照一定的规则进行分层,从而能使整个的网络通信过程更加清晰. 这一分层的核心思想有二: 1.每一层实现不同的功能,并对其上层做透明传输. 2.每一层都会使用到其下一层所提供的服务,并对其上一层提供服务. 早期的网络体系结