socket常用用法总结
程序员文章站
2022-03-18 09:59:59
1 2阻塞非阻塞返回值read/recvrecv会阻塞着接收数据while 循环读. read result <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收都是 <0:出错,=0:连接关闭,>0接收到数据大小write/sendsend会阻塞着发送数据......
1
2
|
阻塞 | 非阻塞 | 返回值 |
read/recv | recv会阻塞着接收数据 | while 循环读. read result <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收 | 都是 <0:出错,=0:连接关闭,>0接收到数据大小 |
write/send | send会阻塞着发送数据 | 如果暂时无法发送数据会返回,不会阻塞着 send,因此需要循环发送 | 都是 <0:出错,=0:连接关闭,>0发送数据大小 |
connect | connect之后不等待,而是异步执行,用select 监听connect | accept,connect 在block情况下错误就是错误,在nonblock的错误情况,参见其他的文章。 |
3 setsocketopt:
3.1 linger: 如果socket是被对方用linger为0的形式关掉,也就是直接发RST的方式关闭的时候,recv也会返回错误,错误码是ENOENT (ENOENT)
3.2 阻塞的socket why 设置 timeout?
4 异常
4.1 EINTER ,EAGAIN = EWOULDBLOCK (区分阻塞 or 非阻塞吗?)
EINTER意思是系统在接收的时候因为收到其他中断信号而*返回,不算socket故障,应该继续接收。
4.2 sigpipe :
test-case: server fail, client write 2 times .P122 <UX network program>
solution: set SIG_IGN
5 socket 缓冲区
5.1 发送大数据
a[1*1024*1024];
while (1)
send (a,...) //大数据1M,要循环发送
因为socket buffer,IO buffer等原因,要循环发送,否则会发生1M数据仅仅发送,接收100多k,其他数据莫名其妙的丢失,可能是被冲掉了 ? 因为socket buffer 太小??
本文地址:https://blog.csdn.net/fdsafwagdagadg6576/article/details/108587897