【问题标题】:Need help on bytes via Socket通过 Socket 需要有关字节的帮助
【发布时间】:2013-01-02 20:26:39
【问题描述】:

我正在尝试通过套接字发送一些数据,因此将其转换为字节,然后返回服务器上的字符串。但我显然只能做一个。

服务器代码:

static void Read(IAsyncResult ar)
{
    int fileNameLen = 1;
    //int userNameLen = 9;

    State newState = (State)ar.AsyncState; //gets state of Socket
    Socket handler = newState.Socket_w; //passes Socket to handler

    int bytesRead = handler.EndReceive(ar); //terminates Data Receive from Socket.

    if (bytesRead > 0)
    {
        if (flag == 0)
        {
            fileNameLen = BitConverter.ToInt32(newState.buffer, 0); //gets filename length
            fileName = Encoding.UTF8.GetString(newState.buffer, 4, fileNameLen); //gets filename
            //userNameLen = BitConverter.ToInt32(newState.buffer, 8);
            //getUsername = Encoding.UTF8.GetString(newState.buffer, 8, fileNameLen);

            flag++;
        }
    }    
}

客户端代码:

internal static void uploadFile(string host, string username, string getGame, string filename, string filepath)
{
    byte[] m_clientData;
    Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    byte[] fileName = Encoding.UTF8.GetBytes(username + "_" + filename);
    byte[] fileData = File.ReadAllBytes(filepath);
    byte[] fileNameLen = BitConverter.GetBytes(fileName.Length);
    //byte[] sendUsername = Encoding.UTF8.GetBytes(username);
    //byte[] sendUsernameLen = BitConverter.GetBytes(sendUsername.Length);
    //byte[] sendGame = Encoding.UTF8.GetBytes(getGame);
    //byte[] sendGameLen = BitConverter.GetBytes(sendGame.Length);

    m_clientData = new byte[4 + fileName.Length + fileData.Length];

    fileNameLen.CopyTo(m_clientData, 0);
    fileName.CopyTo(m_clientData, 4);
    fileData.CopyTo(m_clientData, 4 + fileName.Length);

    //sendUsernameLen.CopyTo(m_clientData, 0);
    //sendUsername.CopyTo(m_clientData, 4);

    //sendGameLen.CopyTo(m_clientData, 0);
    //sendGame.CopyTo(m_clientData, 4);

    clientSock.Connect(host, 8889);
    clientSock.Send(m_clientData); //tofix exception
    clientSock.Close();
}

我似乎无法在服务器上正确解密它。谁能帮我解决缓冲区大小之类的问题?

【问题讨论】:

  • 不能解密是什么意思?您的意思是您看不到字节,或者未加密的结果不是原始文件,还是在尝试解密时收到错误消息?
  • 我的意思是,要么我得到的结果与 \0\0\0 混杂在一起,要么我害怕由于不正确的缓冲区解析而导致的文本乱码。

标签: c# .net sockets buffer byte


【解决方案1】:

Read 对发送的内容一无所知; TCP 基本上只是一个流 - 所以没有绝对没有可以说您在一次调用 Read 时就拥有了所有数据;你可以:

  • 正是您发送的数据量
  • 一条消息的一部分
  • 17 条消息
  • 一条消息的结束和下一条消息的开始
  • 消息中的 1 个单独字节

您需要设计某种成帧协议,让接收者知道他们何时收到完整的消息。这可以像长度前缀一样简单,也可以更复杂。然后,您应该在内存中缓冲数据(或逐渐处理它),直到获得整个消息。对Read 的一次调用非常不太可能代表一条完整的消息。实际上,如果消息大于您的newstate.buffer,则保证不会出现这种情况,但即使对于小消息和大缓冲区,您也可以获得相同的结果。

【讨论】:

  • 感谢您的回复,我有一种灵感并将其调整为工作 :p 。问候。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2014-12-26
  • 2013-08-12
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多