C# 套接字接收到字符串

本文关键字:字符串 套接字 | 更新日期: 2023-09-27 18:32:10

按照本指南,我编写了以下函数:

public string ConnectToHost(string ip, int port)
{
    Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
    IPAddress host = IPAddress.Parse(ip);
    IPEndPoint ipep = new IPEndPoint(host, port);
    socket.Connect(ipep);
    byte[] msg = Encoding.Unicode.GetBytes("<Client Quit>");
    int msgSend = socket.Send(msg);
    byte[] bytes;
    int byteRecieve;
    String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);
    while (socket.Available > 0)
    {
        byteRecieve = socket.Receive(bytes);
        msgRecieved += Encoding.Unicode.GetString(bytes, 0, byteRecieve);
    }
    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
    return msgRecieved;
}

但是我得到错误

使用未赋值的局部变量"

bytes"和使用未赋值的局部变量"byteRecieve"

关于代码的谎言

String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);

从线路中删除Encoding.Unicode.GetString(bytes, 0, byteRecieve);并且只有String msgRecieved;给出了相同的错误,但在while循环中。

如何让此函数以字符串形式返回收到的字节?

C# 套接字接收到字符串

好吧,您确实在没有分配这些变量的情况下使用这些变量,不是吗?这是不允许的,因为不清楚这意味着什么。在这种情况下,您可以通过说以下内容来使其工作:

    byte[] bytes = new byte[4096];
    int byteRecieve = 0;

当你解决了那些与套接字无关的编译器错误时,你会发现使用Available低估了传入的数据量。它几乎从来都没用。

此外,您会发现Unicode编码字符串无法在任意边界上分解,因此这也不起作用。使用StreamReader .

您可能应该继续寻找不同的教程。大多数都非常破碎。TCP很难正确。

看看这两行代码:

int byteRecieve;

String msgRecieved = Encoding.Unicode.GetString(bytes, 0, byteRecieve);

在第一行中,您声明byteRecieve ,但不为其赋值。在第二行中,您可以使用它。由于您尚未为其赋值,因此会收到错误消息。

由于您在while循环中做了正确的事情,因此您可以简单地删除上面的第二行。

byte [] bytes;

应该变成类似的东西

byte [] bytes = new bytes[256];

或类似。同样,您的版本仅将bytes声明为一个字节数组,但没有为其分配/分配实际的数组值。