相关疑难解决方法(0)

C#异步TCP套接字:处理缓冲区大小和大量传输

使用阻塞TCP套接字时,我不必指定缓冲区大小.例如:

using (var client = new TcpClient())
{
    client.Connect(ServerIp, ServerPort);

    using (reader = new BinaryReader(client.GetStream()))
    using (writer = new BinaryWriter(client.GetStream()))
    {
        var byteCount = reader.ReadInt32();
        reader.ReadBytes(byteCount);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意远程主机如何发送任意数量的字节.

但是,当使用异步TCP套接字时,我需要创建一个缓冲区,从而硬编码最大大小:

 var buffer = new byte[BufferSize];
 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null);
Run Code Online (Sandbox Code Playgroud)

我可以简单地将缓冲区大小设置为1024字节.如果我只需要接收一小块数据,那就行了.但是,如果我需要接收10 MB的序列化对象呢?我可以将缓冲区大小设置为10*1024*1024 ......但是只要应用程序运行,就会浪费10 MB的RAM.这太傻了.

所以,我的问题是:如何使用异步TCP套接字有效地接收大块数据?

c# sockets buffer asynchronous tcp

4
推荐指数
1
解决办法
7972
查看次数

发送具有前导长度值的套接字数据

我想使用PHP套接字通过网络连接将JSON消息从PHP脚本发送到C#应用程序.

通常,对于二进制协议,每条消息的前4个字节必须是一个整数,表示消息的长度(多少字节).

在C#中,我为每条消息添加一个整数,该整数表示消息的长度,如下所示:

byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");            
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);
Run Code Online (Sandbox Code Playgroud)

据我所知,在PHP中,函数socket_send只接受字符串.那么,我怎么能在PHP 5.x中做同样的前缀呢?

更新:我发布了一个关于如何从网络套接字接收此类前缀数据的后续问题.

php sockets prefix php-socket

4
推荐指数
2
解决办法
2165
查看次数

标签 统计

sockets ×2

asynchronous ×1

buffer ×1

c# ×1

php ×1

php-socket ×1

prefix ×1

tcp ×1