解决关闭socket之前,提交socket发送缓冲内容的问题

经过长时间的调整,测试,今天终于解决了web服务器关闭socket时,缓冲中未发送的内容被抛弃的问题。

公司让我开发一个小的服务器支撑系统,我使用C++编写了一个小的httpd服务器,以便能够打造自己的服务器,扩充自己想要的各种功能(如各种统计功能、扩展接口功能)。在开始的简单网页测试时,没有发现问题;但是,在系统部署上线后,偶尔出现IE界面长时间转圈圈,就是不显示页面的内容。有时通过点击刷新几次,系统又正常。因为这个系统比较小,使用也不是很频繁,所以系统将就着使用。

过了一段时间,乘着系统升级整改,抽时间专门测试了httpd的各个方面,包括分析IE获取的页面代码问题。发现IE接收到的数据不完整。分析服务器调试日志,也没有发现运行问题。这一度让我非常困惑。

今天,我上网核查了Socket的缓冲、延时、shutdown、close等函数的相关方面知识,基本锁定了socket的缓冲问题。

新的问题来了,socket没有直接提供提交缓冲中内容发送的功能,如何实现呢?

我测试了TCP_NODELAY, SO_LINGER,shutdown()的各种参数,均不能解决问题。

经过长时间的调整,httpd服务器的问题不但得不到解决,反而有性能下降的趋势。

在困顿之中,突然,灵光一闪:如果我在发送完数据之后,在close socket之前,把SO_SNDBUF的大小设置为0,socket是否会把缓冲中的数据发送出去?马上动手修改、测试,结果非常理想,泪流满面!

现在,httpd的效率很高,IE的反应非常迅速!

时间: 2024-11-06 09:26:41

解决关闭socket之前,提交socket发送缓冲内容的问题的相关文章

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.连接服务器 2.发送和接收数据 3.关闭网络连接 一.连

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.         连接服务器 2.         发送

C#Socket文件传输(发送与接收代码)

这里是发送的代码: SendVarData是转码后发送函数 1 /// <summary> 2 /// 发送文件 3 /// </summary> 4 /// <param name="userName"></param> 5 private void SendFileToClient(string userName) 6 { 7 User targetUser = userListDict[userName]; 8 String tar

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused

Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused 在docker中搭建的redis主从集群时,从服务器上的redis日志报错: 32677:S 08 Feb 16:14:38.947 * Connecting to MASTER 172.168.10.70:6379 32677:S 08 Feb 16:14:38.948 * MASTER <-> SLAVE sync started 32677:S 08

解决ftp连接出现 无法从控制 Socket 读取。Socket 错误 = #10054。

ftp连接会显示以下错误信息 无法从控制 Socket 读取.Socket 错误 = #10054 或者是这样的信息 Opening data channel for directory list.Transfer OK421 No-transfer-time exceeded. Closing control connection.disconnected. control connection. 奇怪的是本地电脑无法连接,甚至是同一个局域网的其它电脑都无法连接,但是使用另外一台服务器去连接f

Socket tips: 同意socket发送UDP Broadcast

假设创建一个UDP Socket: socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol); 如今就用它来发送Broadcast.一定会出错的,Socket API不同意这样做.那么怎样使它支持broadcast呢?须要继续做一些设置: int broadcastPermission = 1; setsockopt(socketHandle, SOL_SO

C#通过Socket在网络间发送和接收图片的演示源码

将内容过程中常用的内容段备份一次,如下资料是关于C#通过Socket在网络间发送和接收图片的演示的内容,希望能对码农们有帮助. using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using System.Net;using System.IO; namespace ConsoleApplication1{Class Program{static void Main (S

【Socket】Java Socket基础编程

Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基本示例 二.消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三.服务端优化 3.1 服务端并发处理能力 3.2