socket常用用法总结

   

socket常用用法总结

 

 

阻塞 非阻塞 返回值
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 太小??