当前位置: 首页 > 知识库问答 >
问题:

在TCP套接字上丢失一个字节

谢涵煦
2023-03-14
public class Packet
{
    public byte[] Buffer;

    public Packet(string message)
    {
        Buffer = new byte[255];

        byte[] messageArray = Encoding.ASCII.GetBytes(message);

        Buffer[0] = (byte)messageArray.GetLength(0);

        for (int i = 0; i < messageArray.GetLength(0); i++)
        {
            Buffer[i+1] = messageArray[i];
        }

    }
    public Packet(byte[] buffer)
    {
        Buffer = buffer;
    }
    public string GetMessage()
    {
        List<byte> messageBuffer = new List<byte>();

        for (int i = 1; i <= Buffer[0]; i++)
        {
            messageBuffer.Add(Buffer[i]);
        }

        return Encoding.ASCII.GetString(messageBuffer.ToArray());
    }

}
class Client
{
    public static List<Client> connectedClients = new List<Client>();
    public Socket Sock;
    public byte[] Buffer = new byte[255];

    public Client(Socket pSock)
    {
        Sock = pSock;
        Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null);
    }

    public void Send(byte[] pBuffer)
    {
        Sock.BeginSend(pBuffer, 0, pBuffer.GetLength(0), SocketFlags.None, new AsyncCallback(SendCallBack), null);
    }

    public void SendCallBack(IAsyncResult AR)
    {
        Console.WriteLine("Sent");
        Sock.EndSend(AR);
    }
    public void RecieveCallBack(IAsyncResult AR)
    {
        Sock.EndReceive(AR);

        Packet recPacket = new Packet(Buffer);
        Console.WriteLine(recPacket.GetMessage());

        Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null);
    }
}
    public Client(Socket pSock)
    {
        Sock = pSock;
        Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null);
    }

    public void Send(byte[] pBuffer)
    {
        Sock.BeginSend(pBuffer, 0, pBuffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), null);
    }

    public void SendCallBack(IAsyncResult AR)
    {
        Console.WriteLine("Sent");
        Sock.EndSend(AR);
    }
    public void RecieveCallBack(IAsyncResult AR)
    {
        Sock.EndReceive(AR);

        Packet recPacket = new Packet(Buffer);
        Console.WriteLine(recPacket.GetMessage());

        Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null);
    }
}`

共有1个答案

杜俊逸
2023-03-14

已解决

错误是在发送方法中,我没有包括。

sock.BeginSend(sentBuffer[0].Buffer, 0, sentBuffer[0].Buffer[0], SocketFlags.None, new AsyncCallback(SendCallBack), null);

sentBuffer是一个列表,是一个队列。我把它改成了255,它工作了

 类似资料:
  • 问题内容: 任何人都可以通过TCP发送Ascii msg的示例给我(在网上找不到示例) 谢谢, 射线。 问题答案: 这是一个写入和读取回显服务器的示例。 简化摘录:

  • 结果: 在步骤6中,如果服务器在几分钟内关闭死连接--CY,则新通道CY2将变为单向--从客户端Y发送的数据不能到达服务器,包括ACK数据包,而反之亦然。 如果服务器在很长的时间(例如2小时)内关闭了已死的连接--CY,则不会出现任何问题。 这个问题只在运行NAT时才会发生,至少我们在同一个LAN中运行应用程序时不会重现这个问题(不需要穿越NAT)。 更多信息: 1)第一台计算机上的连接A:192

  • 在一个简单的客户端-服务器TCP套接字中,当我试图在Android Studio中创建客户端套接字时,遇到了一个问题。导致错误的指令是<code>Sockets=new Socket(主机名,端口) 我使用的端口是 1993,我尝试了变量的一些值: 在每种情况下,应用程序都会因为这个错误而停止,下面的错误属于第一点,其他的得到类似的错误。 Eclipse中的相同指令工作,我在命令行上使用服务器“n

  • 创建套接字并建立连接后,我使用BufferedReader和PrintWriter从套接字进行写/读操作。 当我用完插座后,我就把它关上。 这将导致发送一个TCP fin,并留下一个半开的传输控制协议。有什么方法可以检测客户端/服务器是否关闭了连接?

  • 我正在编写一个简单的文件客户端-服务器通信来使用TCP传输文件。我想使用python套接字编程来实现它的代码。我遵循这个例子。我想知道是否有可能控制数据包丢失和重传。例如,当数据包丢失时,我可以发送零字节大小的丢失,而不是重传实际丢失的段吗?

  • 在套接字最终接受另一端消失的情况下,什么指定了这个超时?是操作系统(Ubuntu 11.04),还是来自TCP/IP规范,还是套接字配置选项?