【问题标题】:Why is my program not sending keyboard data over socket?为什么我的程序不通过套接字发送键盘数据?
【发布时间】:2019-03-31 00:16:11
【问题描述】:

我有一个简单的程序,旨在通过 TCP 套接字发送原始文本数据。我认为这是一个缓冲问题;但我不确定。似乎没有发送任何数据。

from threading import Thread as thread
from sys import argv
from socket import socket
from tty import setraw
from sys import stdin
from sys import stdout
def rx(so):
    while True:
        stdout.write(so.recv(1).replace("\n", "\n\r"))
setraw(stdin.fileno())
so = socket()
so.connect((argv[1], int(argv[2])))
thread(target=rx, args=(so, )).start()
while True: so.send(stdin.read(1))

编辑澄清: 未发送键盘数据。

【问题讨论】:

  • 这不会发送任何东西,除非你给它发送一些东西。 \n\r错了,应该是\r\n
  • 问:你在按键的任何地方都按了“返回”吗? Stdin WILL 缓冲数据,直到你点击“return”...
  • @paulsm4 是的,但它应该是无缓冲的

标签: python sockets buffering


【解决方案1】:
  1. 小问题:

    正如 user207421 所说,“\n\r”是错误的。正确的 DOS CR/LF 序列是'\r\n'
    谁知道——也许你根本不需要那个“replace()”。

  2. 第一步:验证您可以发送/接收任何东西

    问:当您键入几个字符然后点击“return”时,您是否看到从您的套接字返回的数据?

    请确认“是”或“否”。

  3. Python 套接字:尝试禁用 Nagle

    试试this

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    
  4. 原始键盘输入:

    如果您已经验证了第 2 步和第 3 步(您能够发送和接收数据,并且套接字缓冲不是问题),那么您已将问题隔离到“stdin 缓冲”。

    在这里查看更多建议:unbuffered read from stdin in python

  5. 补充建议:

    对于故障排除,也可以尝试从不同的程序发送套接字数据:“telnet”、“curl”、第二个 Python 脚本等。

请回复并告诉我们您发现了什么!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多