Python到C#TCP传输会破坏超过1523字节的数据

时间:2013-11-20 20:01:37

标签: c# python sockets tcp

我正在尝试从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个字节是正确的,其余的都是乱码 - 至少看似随意。

知道可能是什么原因?

2 个答案:

答案 0 :(得分:3)

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();

答案 1 :(得分:0)

我似乎急忙回答这个问题。

将TcpClient更改为Socket修复了问题。方法保持不变。