PHP到C# - 套接字 - 文件随机破坏

Sud*_*ha 4 php c# sockets tcp

我有一个TCP连接,客户端PHP和服务器是C#

此套接字连接将图像传输到socket服务器,但是

随机某些时候传输被破坏[图像hash不同]

PHP客户端

$file = file_get_contents('img.bmp');
socket_write($socket,$file.$cordinates); it sends //image + sme other data
$recv = socket_read ($socket, 500, PHP_BINARY_READ) // read the server response
Run Code Online (Sandbox Code Playgroud)

此流始终传输位图图像+一些数据.


C#

 this.DataSocket = this.Listner.Accept();
int filelength = this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None)
Run Code Online (Sandbox Code Playgroud)

我调查了一个新浏览器 [新开放]这从未失败过.但是当我在同一个浏览器中经常多次使用这个创建的服务时,这意味着失败.

当我用不同的浏览器浏览器的新实例检查时,它在最初的几次尝试中从未失败.

我认为这是一个问题,caching但我禁用caching使用headers但存在同样的问题

Jer*_*wdy 10

您不能简单地期望立即将整个文件写入套接字,也不能期望在一次操作中从套接字读取文件.从BSD套接字到WinSock到.NET网络类的几乎任何网络编程API的套接字读写API都将发送或接收数据,直到所需的字节数.

如果您查看PHP socket_write的文档,例如:

返回成功写入套接字的字节数,如果失败则返回FALSE.可以使用socket_last_error()检索错误代码.可以将此代码传递给socket_strerror()以获取错误的文本说明.

注意:socket_write()返回零是完全有效的,这意味着没有写入字节.如果出现错误,请务必使用==运算符检查FALSE.

您通常希望选择块大小,如4096或16384,并循环发送或接收该块大小,直到您获得所需的字节数发送或接收.您的代码必须检查您正在调用的发送或接收函数的返回值,并相应地调整文件指针.如果transmit返回0,那可能只意味着发送缓冲区已满(不是致命),因此继续发送(可能需要Sleep(0)延迟).如果receive返回0,这通常意味着另一方已完全关闭连接.

简单网络代码使用中最关键的缺陷之一是,在发送文件数据之前,您没有发送文件大小,因此接收方无法在发送响应之前知道要读取多少内容.对于像这样的简单操作,我建议只发送二进制32位整数(4个字节).这将是您的操作架构的一部分.因此,接收器将首先读取4个字节,并从中知道需要读取多少字节(一次一个缓冲区大小).接收器继续读取,直到它们有那么多字节.

我希望这有帮助.如果套接字代码与您尝试的用法一样简单,那将是很好的,但不幸的是,它不是.您必须选择一个缓冲区大小,然后继续读取或写入该大小的缓冲区,直到您得到您想要的内容,并且您必须向另一方传达您计划发送的数据量.