python 中的套接字问题

2024-03-11

我有一个用 C 编写的服务器,我想用 python 编写一个客户端。当 python 客户端想要发送文件时,它会发送一个字符串“send some_file”,后跟文件的内容和字符串“end some_file”。这是我的客户端代码:


file = sys.argv[1]
host = sys.argv[2]
port = int(sys.argv[3])
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((host,port))
send_str = "send %s" % file
end_str = "end %s" % file
sock.send(send_str)
sock.send("\n")
sock.send(open(file).read())
sock.send("\n")
sock.send(end_str)
sock.send("\n")

问题是这样的:

  • 服务器从recv接收“send some_file”字符串

  • 在第二次接收时,文件的内容和“结束文件”字符串一起发送

在服务器代码中,缓冲区的大小是 4096。我第一次注意到这个错误是在尝试发送小于 4096k 的文件时。 如何确保服务器独立接收字符串?


使用套接字编程,即使您进行2次独立的发送,也不意味着另一方会将它们作为2次独立的接收来接收。

一种适用于字符串和二进制数据的简单解决方案是:首先发送消息中的字节数,然后发送消息。

以下是您应该对每条消息执行的操作,无论它是文件还是字符串:

发送方:

  • 发送4个字节,保存后续发送的字节数
  • 发送实际数据

接收端:

  • 从接收端执行一个循环,阻塞读取 4 个字节
  • 然后对前面 4 个字节中指定的字符数执行块读取以获取数据。

除了我上面提到的 4 字节长度标头之外,您还可以添加一个恒定大小的命令类型标头(再次为整数),它描述了以下 recv.txt 中的内容。

您还可以考虑使用像 HTTP 这样的协议,它已经为您完成了很多工作,并且有很好的包装器库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中的套接字问题 的相关文章

随机推荐

  • @EnableMongoAuditing 和 @CreatedDate 审核在 Spring Boot 2.4.3 中不起作用

    我正在关注这个例子https github com hantsy spring reactive sample blob master boot exception handler src main java com example dem
  • jquery地址怎么用呢?

    我试图了解如何使用 jQuery 地址插件来处理 ajax 的深度链接 但文档非常差 我找不到任何好的教程来解释正在发生的事情 我认为一个好的文档和好的例子对于每个插件都很重要 有人可以解释或提供一些有用的解释链接吗 address cha
  • codeigniter $this->upload->do_upload() = false

    我正在尝试上传文件 我选择一个文件然后提交它 但 this gt upload gt do upload 的结果始终为 false 这是我的表格
  • subprocess.Popen execve() arg 3 包含非字符串值

    我正在尝试通过 shell 运行另一个脚本 该脚本使用一组修改后的环境变量 def cgi call script environ pSCRIPT subprocess Popen script stdout subprocess PIPE
  • 替换失败是否是依赖非类型模板参数的错误?

    假设我有这些模板别名 enum class enabler template
  • “出于安全原因”pcntl 无法在 Ubuntu 上运行

    我已经在 Ubuntu 32 位 12 10 上运行的 PHP 5 4 6 上安装了 pcntl 使用this http www crimulus com 2010 07 30 howto enable pcntl in ubuntu ph
  • 包含声明

    我不明白的重要性CONTAINSFortran 90 中的声明 例如 PROGRAM BLABLA IMPLICIT NONE INTEGER i j k i 1 j 1 k 1 PRINT i j k CALL ABC i j k PRI
  • Gtk-CRITICAL **:IA__gtk_widget_style_get:断言“GTK_IS_WIDGET(小部件)”失败

    在静态构建我的 qt 应用程序之后 configure static debug and release confirm license nomake demos nomake examples nomake tools 它工作正常 但我收
  • 如何使固定大小的主体(或div)始终保持在页面的中心(甚至垂直!)

    我试图使 1024x768 的主体始终保持在页面的中心 上下间距相同 左右间距也相同 但是我在执行此操作时遇到了麻烦 我用的是trick距顶部的间距为 50 然后我将主体 绝对 定位在 384px 即 768 的一半 然而这种方法给我带来了
  • Yii 单选按钮

    我在 Yii 中使用单选按钮 无论我做什么 我都无法获取要发布的所选按钮的值 我确信这只是简单的事情 我没有使用 radioButtonList 因为我希望每个按钮都存在于其自己的 div 中 并在其上方有一个图像 这是我从视图中看到的代码
  • 为什么 Scala 在按名称参数重载时的行为与按值参数重载时的行为不同?

    鉴于以下 Scala 代码 object test def byval a Int println Int def byval a Long println Long def byname a gt Int println gt Int d
  • 为什么 [regex] match() 和 -match 不同?

    当我在 PowerShell 中使用正则表达式时 我偶然发现了一个与 Powershell 不同的奇怪场景 regex 班级匹配 match 在我尝试从字符串中删除空行的情况下 当使用 replace我的表情在与时都不起作用 regex r
  • 如何散列 std::string?

    我正在制作一个小实用程序来帮助我通过重复来记住密码 我想每天只输入一次密码 而不是在每次会话之前输入 当然 我不会存储密码本身 但很乐意存储其哈希值 那么 获取哈希值的最简单方法是什么std string使用 C 标准库 对于不涉及外部库的
  • 多重继承和指针实现

    给出以下代码 namespace Example1 class A public A virtual A private float data A class B public B virtual B protected float dat
  • viewpager和fragment中布局的幽灵

    I use the viewpager and fragment the adapter is FragmentStatePagerAdapter fragment s layout i use is SwipeRefreshLayout
  • 分配器类型参数的 C++ 设计模式

    C 03 标准库在将类型传递给旨在作为分配器的类时使用简单的模板类型参数 这是可能的 因为模板在 C 中的工作方式 但是 它并不是很简单 您可能不知道类型定义到底应该是什么样子 特别是在非标准类型的情况下 我认为使用适配器类可能是个好主意
  • vue动态mapGetters

    我有一个 props 我想用它来制作动态 mapGetters 但是 mapGetters 将 props 视为未定义 可能是因为计算值是在 props 之前加载的 有人知道我怎样才能让它变得动态吗 我的代码如下 export defaul
  • 从 VSCode 中删除 git 集成

    我下载了 Visual Studio Code 来在工作中试用 我几乎爱上了它的一切 但我不喜欢的一部分是 Git 集成 我导入了整个工作文件夹 约 14000 个源文件 git 项目 Visual Studio Code 中的布局和所有内
  • 切换大小写奇怪的范围

    在查看一些第 3 方 C 代码时 我遇到了类似的情况 switch state case 0 if c A open brace code break brace not closed case 1 code break close bra
  • python 中的套接字问题

    我有一个用 C 编写的服务器 我想用 python 编写一个客户端 当 python 客户端想要发送文件时 它会发送一个字符串 send some file 后跟文件的内容和字符串 end some file 这是我的客户端代码 file