怎样清空socket的缓冲区?

时间:2023-02-01 09:00:50
操作系统:Linux
语言:C

问题描述:
   程序中创建套接字(端口是我自己分配的),频繁进行发送和接收。为了避免程序重启时client读入缓冲区中遗留的数据,我想分别清空socket发送缓冲区和socket接收缓冲区。请问有没有什么函数可以做到这一点?如果没有,应该怎么解决?谢谢

7 个解决方案

#1


如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。

#2


有一个unix的系统调用,好像叫flush吧

#3


谢谢made_in_(潦倒),我还是有些问题:)

如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
   ~~~~~~~~~那比如说我的程序是被非法关掉的,并没有执行到close呢?重启时会不会有问题呢?

如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                (port 是我自己分配的,因此每次都是指定的同一端口)

#4


即使客户端程序是非法关掉的,重启时也不会有问题。一则系统会帮你做一些善后工作。二来再次启动后系统会分配你新的socket和相应的buffer。
不管你用的什么协议,在服务器端的port虽然是可以bind,但客户端连接server时,它的port一般是系统挑选的。所以client端的ip:port对已经和以前不同,那么这个连接也被server视为新连接,自然也不会将以前的信息发给它。

#5


呵呵,你还没弄明白“对等”的含义
一个不成功的连接是一个3元组(hostip,hostport,socket),一个成功的连接是一个5元组(3元组+对等ip+对等port)。。。

问题1,对于客户端,port是由系统分配的,如果程序非法关闭,且连结还未时方的话,是不可能再在同一port上建立连结的,系统会为你分配个新的。

问题2,连接是对于5元组来说的,客户端的port变了,5元组也就变了,也就是不同的连结了

#6


谢谢made_in_(潦倒)和 liao2001(知之为知之,不知为不知。。。)
你们清晰的讲解让我原来模糊的概念变清楚了:)

ShiChao(cpp),我只找到了Tcl中有flush这个函数,不过还是多谢参与


结贴结贴!


#7


我也明白了

#1


如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。

#2


有一个unix的系统调用,好像叫flush吧

#3


谢谢made_in_(潦倒),我还是有些问题:)

如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
   ~~~~~~~~~那比如说我的程序是被非法关掉的,并没有执行到close呢?重启时会不会有问题呢?

如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                (port 是我自己分配的,因此每次都是指定的同一端口)

#4


即使客户端程序是非法关掉的,重启时也不会有问题。一则系统会帮你做一些善后工作。二来再次启动后系统会分配你新的socket和相应的buffer。
不管你用的什么协议,在服务器端的port虽然是可以bind,但客户端连接server时,它的port一般是系统挑选的。所以client端的ip:port对已经和以前不同,那么这个连接也被server视为新连接,自然也不会将以前的信息发给它。

#5


呵呵,你还没弄明白“对等”的含义
一个不成功的连接是一个3元组(hostip,hostport,socket),一个成功的连接是一个5元组(3元组+对等ip+对等port)。。。

问题1,对于客户端,port是由系统分配的,如果程序非法关闭,且连结还未时方的话,是不可能再在同一port上建立连结的,系统会为你分配个新的。

问题2,连接是对于5元组来说的,客户端的port变了,5元组也就变了,也就是不同的连结了

#6


谢谢made_in_(潦倒)和 liao2001(知之为知之,不知为不知。。。)
你们清晰的讲解让我原来模糊的概念变清楚了:)

ShiChao(cpp),我只找到了Tcl中有flush这个函数,不过还是多谢参与


结贴结贴!


#7


我也明白了