首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >TCP套接字转读

TCP套接字转读
EN

Stack Overflow用户
提问于 2017-10-23 09:02:35
回答 2查看 71关注 0票数 0

我在Python套接字中使用TCP,将数据从一台计算机传输到另一台计算机。但是,recv命令读取的内容比服务器端应该读取的要多,因此我找不到问题。

client.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while rval:
    image_string = frame.tostring()
    sock.sendall(image_string)
    rval, frame = vc.read()

server.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while True:
    image_string = ""
    while len(image_string) < message_size:
        data = conn.recv(message_size)
        image_string += data

消息的长度是921600 (message_size),所以它是用sendall发送的,但是当收到消息时,当我打印到达消息的长度时,长度有时是错误的,有时是正确的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
921600
921600
921923 # wrong
922601 # wrong
921682 # wrong
921600
921600
921780 # wrong

正如你所看到的,错误的到达没有模式。当我使用TCP时,我希望有更多的一致性,但是似乎缓冲区混淆了,并以某种方式接收了下一条消息的一部分,因此产生了一条更长的消息。这里有什么问题?

我试着只添加代码的相关部分,如果您愿意,我可以添加更多代码,但是代码在localhost上表现良好,但在两台计算机上失败,因此除了发送部分之外,不存在错误。

Edit1: --我稍微检查了一下这个question,它提到客户机中的所有发送命令都可能不会被服务器中的一个recv接收,但是我不知道如何将其应用到实践中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-23 09:46:07

TCP是一种流协议。您发送的数据块的大小与您接收的数据块之间绝对没有任何联系。如果您想要接收已知大小的数据,则完全取决于您是否只请求那么多数据:当前每次都请求数据的总长度,这将尝试读取太多数据,除非在第一个.recv()调用检索到整个数据的不太可能的情况下。基本上,您需要做一些类似data = conn.recv(message_size - len(image_string))的事情,以反映剩余数据量正在减少的事实。

票数 1
EN

Stack Overflow用户

发布于 2017-10-23 10:52:09

将TCP看作是字节的原始流。跟踪你在流中的位置并正确地解释它是你的责任。缓冲所读取的内容,并仅提取当前需要的内容。

下面是一个(未经测试的)类来说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Buffer:
    def __init__(self,socket):
        self.socket = socket
        self.buffer = b''
    def recv_exactly(self,count):
        #  Could return less if socket closes early...
        while len(self.buffer) < count:
            data = self.socket.recv(4096)
            if not data: break
            self.buffer += data
        ret,self.buffer = self.buffer[:count],self.buffer[count:]
        return ret

recv总是请求相同数量的数据,并在缓冲区中对其进行排队。recv_exactly只返回请求的字节数,并在缓冲区中保留任何额外的字节数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46894768

复制
相关文章
基于TCP的套接字
socket通信流程与打电话流程类似,我们就以打电话为例来实现一个low版的套接字通信
超蛋lhy
2018/08/31
7610
基于TCP的套接字
Socket套接字简介 转
Socket套接字由远景研究规划局(Advanced Research Projects Agency, ARPA)资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将TCP/IP协议相关软件移植到UNIX类系统中。设计者开发了一个接口,以便应用程序能简单地调用该接口通信。这个接口不断完善,最终形成了Socket套接字。Linux系统采用了Socket套接字,因此,Socket接口就被广泛使用,到现在已经成为事实上的标准。与套接字相关的函数被包含在头文件sys/socket.h中。
wuweixiang
2018/10/11
1.1K0
C中实现TCP套接字
最近一直出差,大家不好意思。文章更新的有点慢,希望大家包涵!!谢谢!!!今天讲工业现在用到最多的通讯协议。
苏州程序大白
2021/08/13
9780
C中实现TCP套接字
TCP套接字编程——Python语言描述
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88649682
zy010101
2019/05/25
5980
基于TCP协议的套接字编程
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
小小咸鱼YwY
2019/07/24
8360
unix网络编程——TCP套接字编程
  TCP客户端和服务端所需的基本套接字。服务器先启动,之后的某个时刻客户端启动并试图连接到服务器。之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应。该过程一直持续下去,直到客户端关闭,给服务端发送EOF(文件结束),服务器也关闭连接的服务器端,然后结束运行或者等待新的客户发起连接请求
Mister24
2018/09/19
1.2K0
unix网络编程——TCP套接字编程
原始套接字 IP_HDRINCL 转
原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以   编写基于IP协议的通讯程序。   1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接字可以接收内核传递给原始套接字
战神伽罗
2019/08/30
2.4K0
套接字 socket 和 tcp 连接过程
Unix/Linux 基本哲学之一就是"一切皆文件",即一切都可以用 "open -> read/write -> close" 来操作,socket 也可以理解成是一种特殊的文件。
JMCui
2020/12/21
2.5K0
套接字 socket 和 tcp 连接过程
Python实现TCP协议套接字多路复用
首先,我们来看一个场景:一位老师在机房给60位学生讲完一个案例之后,布置了一个限时完成的小作业,学生完成后老师前去检查并进行打分。老师应该如何高效完成这个任务呢?
Python小屋屋主
2020/05/08
1.1K0
Python实现TCP协议套接字多路复用
套接字
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88673990
zy010101
2019/05/25
1.3K0
TCP套接字绑定双端口传输文件(python)
服务端代码 import socket # 创建tcp服务套接字 def main(): tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server_socket_for_file_name = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("1.套接字创建完毕...") # 绑定端口号 tcp_
zhaoolee
2018/04/19
1.2K0
Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
老马的编程之旅
2022/06/22
1.3K0
套接字选项
选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt  setsockopt 用法如下: int getsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); int setsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); 每个协议层套接字的选项有不同的级别: 应用层:SOL_SOCKET 传输层:IPPR
用户1154259
2018/01/17
1.2K0
Python套接字
Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进程间通信)、AF_INET(基于网络)家族。
用户4845306
2019/03/14
1.6K0
Java套接字
  本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
云海谷天
2022/08/09
7680
Java套接字
UNPv13:#第4章#基于TCP套接字编程
概述 socket函数 #inlcude <sys/socket.h> int socket(int family, int type, int protocol); connect函数 #incl
_gongluck
2018/03/09
1.1K0
UNPv13:#第4章#基于TCP套接字编程
16(套接字)
套接字描述符在Unix系统中是用文件描述符实现的。事实上,许多处理文件描述符函数(read和write)都可以处理文件描述符 要创建一个套接字,可以调用socket函数
提莫队长
2019/02/21
9830
Socket 套接字协议
A network socket is an internal endpoint for sending or receiving data within a node on a computer network. Concretely, it is a representation of this endpoint in networking software (protocol stack), such as an entry in a table (listing communication protocol, destination, status, etc.), and is a form of system resource.
vanguard
2020/03/18
1.5K0
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/12/07
1.3K0
套接字Socket编程
点击加载更多

相似问题

php套接字/ tcp套接字

18

套接字和TCP套接字

30

TCP的套接字与Linux的TCP套接字

21

通过TCP套接字(TCP套接字)发送文件( C++ )

12

电子TCP套接字

132
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文