【问题标题】:Python to C# TCP transfer corrupts data beyond 1523rd bytePython 到 C# TCP 传输损坏超过 1523 个字节的数据
【发布时间】:2013-12-05 00:37:56
【问题描述】:

我正在尝试将一个长字符串从 python 服务器发送到 C# 客户端。该字符串的长度为 230400 字节。我都以 64 字节的块发送和接收。服务器代码:

import socket

def initialize():
  global s
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  s.bind(('', 1719))
  s.listen()

initialize()

while(1):
  sock, addr = s.accept()

  msgstr = generate_msg_string() # irrelevant

  msglen = len(msgstr)

  totalsent = 0
  while totalsent < msglen:
    sent = sock.send(msgstr[totalsent:totalsent+64])
    totalsent = totasent + sent

  sock.close()

客户端代码:

TcpClient tcpClient = new TcpClient();
tcpClient.Connect(ip, 1719);
byte[] ba = new byte[230400];
byte[] buffer = new byte[64];
tcpClient.ReceiveBufferSize = 64
int i=0;
while(i != 230400)
{
    stream.Read(buffer, 0, 64);
    buffer.CopyTo(ba, i);
    i += 64;
}
tcpClient.Close();

我已经连续检查了几个连接 - 前 1523 个字节是正确的,其余的都是乱码 - 至少看起来是随机的。

知道可能是什么原因吗?

【问题讨论】:

    标签: c# python sockets tcp


    【解决方案1】:
    while(i != 230400)
    {
        stream.Read(buffer, 0, 64);
        buffer.CopyTo(ba, i);
        i += 64;
    }
    

    这里的基本错误是假设 Read 读取 64 字节。它可以读取任何内容:

    • 0 如果套接字因任何原因关闭
    • 64 字节(如果恰好可用并且它选择)
    • 1-63 字节,只是为了好玩

    除了“如果流已关闭,则为非肯定,否则至少 1 个字节且不超过 64 个字节”,您无法保证任何其他内容

    必须必须读取Read 的返回值,并且只处理该缓冲区的大部分内容。顺便说一句,如果您切换到Socket.Receive,情况仍然如此。

    另外 - 你为什么不首先填写ba,每次增加偏移量并减少计数?

    int count = 230400, offset = 0, read;
    byte[] ba = new byte[count];
    while(count > 0 && (read=stream.Read(ba, offset, count)) > 0)
    {
        offset += read;
        count -= read;
    }
    if(read!=0) throw new EndOfStreamException();
    

    【讨论】:

    • 这确实有帮助。我收到的字符串现在完全正确。谢谢!
    【解决方案2】:

    看来我问的有点匆忙。

    将 TcpClient 更改为 Socket 解决了这个问题。方法保持不变。

    【讨论】:

    • @MarcGravell 是正确的 - 通过不忽略 read() 返回的结果来修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多