Socket连接被重置

一个神奇的bug

用c语言搭建了一个类似http服务器的东西,在返回response后,游览器连接被重置。

原因分析

第一次尝试

试了一下不关闭socket连接,果然连接没有被重置,但是页面一直在加载中。。。。

百度之后

查询到原因可能是服务器关闭连接时不太优雅,导致数据包没发完就关闭连接了。。

解决方法

使用int shutdown(int sockfd,int how)函数确保输出缓冲区的数据全部发出。下面是函数使用方法:
int shutdown(SOCKET s, int howto);
sock 为需要断开的套接字,howto 为断开方式。
howto有以下取值:

  • SD_RECEIVE:关闭接收操作,也就是断开输入流。
  • SD_SEND:关闭发送操作,也就是断开输出流。
  • SD_BOTH:同时关闭接收和发送操作。

shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)
如果关闭读,则接受缓冲区的未读出的所有数据都将丢失,以后不会再接受任何数据
如果关闭写,如果输出缓冲区内有数据,则所有的数据将发送出去后将发送一个FIN信号
而closesocket则是关闭该socket,马上发送FIN信号,所有的未完成发送或者接受的数据都将被丢失.

# 示例
# 先关闭写,再关闭套接字
shutdown(socket, SD_SEND);
closesocket(socket);

这里是我的博客


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,490评论 0 11
  • 网络模型 物理层 物理层表示的是比特流传输,通常包括串口/COM口、并行/LPT口、USB、网线接口、电话线接口;...
    秋风弄影阅读 733评论 0 2
  • socket通信原理 socket又被叫做套接字,它就像连接到两端的插座孔一样,通过建立管道,将两个不同的进程之间...
    jiodg45阅读 1,177评论 0 1
  • (四)赌徒的心理 儿子上了幼儿园大班之后,小丝就想给孩子报几个兴趣班,学学音乐,学学美术,学学跆拳道,怎么也要弄个...
    Kitekiss阅读 353评论 0 2
  • 原文, 全然的经验就是觉知,而觉知是开始,也是结束。 自己对这句话的理解是, 我们生活在经验中,每天在自己的经验中...
    赵红68阅读 154评论 0 0