社区
C语言
帖子详情
怎样清空socket的缓冲区?
maomaomaomao
2003-08-29 11:18:57
操作系统:Linux
语言:C
问题描述:
程序中创建套接字(端口是我自己分配的),频繁进行发送和接收。为了避免程序重启时client读入缓冲区中遗留的数据,我想分别清空socket发送缓冲区和socket接收缓冲区。请问有没有什么函数可以做到这一点?如果没有,应该怎么解决?谢谢
...全文
2114
7
打赏
收藏
怎样清空socket的缓冲区?
操作系统:Linux 语言:C 问题描述: 程序中创建套接字(端口是我自己分配的),频繁进行发送和接收。为了避免程序重启时client读入缓冲区中遗留的数据,我想分别清空socket发送缓冲区和socket接收缓冲区。请问有没有什么函数可以做到这一点?如果没有,应该怎么解决?谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zldcolin
2003-09-15
打赏
举报
回复
我也明白了
liao2001
2003-08-29
打赏
举报
回复
呵呵,你还没弄明白“对等”的含义
一个不成功的连接是一个3元组(hostip,hostport,socket),一个成功的连接是一个5元组(3元组+对等ip+对等port)。。。
问题1,对于客户端,port是由系统分配的,如果程序非法关闭,且连结还未时方的话,是不可能再在同一port上建立连结的,系统会为你分配个新的。
问题2,连接是对于5元组来说的,客户端的port变了,5元组也就变了,也就是不同的连结了
made_in_
2003-08-29
打赏
举报
回复
即使客户端程序是非法关掉的,重启时也不会有问题。一则系统会帮你做一些善后工作。二来再次启动后系统会分配你新的socket和相应的buffer。
不管你用的什么协议,在服务器端的port虽然是可以bind,但客户端连接server时,它的port一般是系统挑选的。所以client端的ip:port对已经和以前不同,那么这个连接也被server视为新连接,自然也不会将以前的信息发给它。
maomaomaomao
2003-08-29
打赏
举报
回复
谢谢made_in_(潦倒),我还是有些问题:)
如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
~~~~~~~~~那比如说我的程序是被非法关掉的,并没有执行到close呢?重启时会不会有问题呢?
如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(port 是我自己分配的,因此每次都是指定的同一端口)
ShiChao
2003-08-29
打赏
举报
回复
有一个unix的系统调用,好像叫flush吧
made_in_
2003-08-29
打赏
举报
回复
如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
如果在服务器端,一般你不需要担心客户端会读入遗留数据,因为当在socket上发送报文时,是按照IP:PORT的形式辨别每一个连接的。当你的客户端再次连接,IP虽然相同,但port已经不同了。
maomaomaomao
2003-08-29
打赏
举报
回复
谢谢made_in_(潦倒)和 liao2001(知之为知之,不知为不知。。。)
你们清晰的讲解让我原来模糊的概念变清楚了:)
ShiChao(cpp),我只找到了Tcl中有flush这个函数,不过还是多谢参与
结贴结贴!
Python中的
Socket
与 ScoketServer 通信及遇到问题解决方法
Socket
有一个
缓冲区
,
缓冲区
是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完
缓冲区
,则可能存在数据怠慢。本文通过实例代码给大家介绍Python中的
Socket
与 ScoketServer 通信及遇到问题解决方法 ,需要的朋友参考下吧
winsock带注册文件
一、WinSock简介
Socket
(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,
Socket
成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows
Socket
规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。
Socket
Handle属性 返回当前
socket
连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收
缓冲区
中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9 错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在
缓冲区
中,要从
缓冲区
中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData
【python】
清空
socket
缓冲区
在上面的代码中,首先对
缓冲区
大小进行设置。然后,通过将
Socket
设置为非阻塞模式,使用一个循环来不断接收剩余的数据,直到
缓冲区
中没有数据为止。这样就
清空
了
Socket
的
缓冲区
。函数来接收数据,数据会被存储在
缓冲区
中。有时候,可能想要先
清空
缓冲区
,以便后续的数据不会被之前的数据影响。在Python中使用
Socket
进行网络通信时,可以通过调用。需要注意的是,
清空
缓冲区
的过程中,如果没有数据可接收,异常,这时候我们可以通过捕获异常来结束循环。
linux
socket
清空
缓存,Linux如何
清空
Socket
缓冲区
最近碰到一个问题,对于阻塞模式的
socket
通讯,如果要实现设备的命令控制,那么进入命令流前,
缓冲区
不能存有上次通讯没有取回的信息,否则一旦命令发出,然后读取
缓冲区
,很显然会读到上一次的剩余数据。做法当然很简单,就是先清除接收区的缓冲数据,可是如何清除?
socket
是这么接收数据的由于
socket
是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,不能保证对方一次性发送的数据能在同一刻...
Linux如何
清空
Socket
缓冲区
Linux如何
清空
Socket
缓冲区
最近碰到一个问题,对于阻塞模式的
socket
通讯,如果要实现设备的命令控制,那么进入命令流前,
缓冲区
不能存有上次通讯没有取回的信息,否则一旦命令发出,然后读取
缓冲区
,很显然会读到上一次的剩余数据。做法当然很简单,就是先清除接收区的缓冲数据,可是如何清除? 网上有很多这样的问题,但都没什么规范的解决办法,有的甚至为了达到
清空
的目的,建议先cl
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章