Чтение из сокета, пока клиент не отправит EOL в C # - PullRequest
0 голосов
/ 25 марта 2009

У меня есть базовый сервер сокетов, который выглядит так:

    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000);
    Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    try
    {
        newsock.Bind(localEndPoint);
    }
    catch (Exception e)
    {
        //Errors handled
    }
    newsock.Listen(10);
    Console.WriteLine("Bound to port 8000");
    Socket client = newsock.Accept();
    while (client.Connected)
    {
        Console.WriteLine("Connection recieved.");
        string outputString = null;
        byte[] buffer = new byte[4];
        client.Receive(buffer);
        string bit = null;
        while (bit != "\r\n" || bit != "\n" || bit != "\r")
        {
            bit = Encoding.ASCII.GetString(buffer);
            outputString += bit;
        }
        Console.WriteLine(outputString);
    }

Прямо сейчас я хочу, чтобы он принимал ввод до тех пор, пока пользователь (в настоящее время telnet) не отправит EOL (нажимает ввод), приведенный выше код в основном то, что я пробовал до сих пор, как мне это делать?

Ответы [ 2 ]

1 голос
/ 25 марта 2009

Итак, TCP работает в потоках, поэтому для обнаружения чего-либо вам нужно предвидеть случай, когда \ r \ n - не единственное, что находится в вашем буфере.

Заменить

bit != "\r\n" || bit != "\n" || bit != "\r"

с

!bit.Contains("\r") && !bit.Contains("\n")

Не забудьте заполнить 'бит' данными из TCPStream ... в значении

    while (bit != "\r\n" || bit != "\n" || bit != "\r")
    {
        bit = Encoding.ASCII.GetString(buffer);
        outputString += bit;
    }

вам нужно

    client.Receive(buffer);

так выглядит:

    while (bit != "\r\n" || bit != "\n" || bit != "\r")
    {
        bit = Encoding.ASCII.GetString(buffer);
        outputString += bit;
        client.Receive(buffer);
    }

И ... обработчик исключений сообщит вам, когда клиент отключится.

0 голосов
/ 25 марта 2009

Возможно, при отправке символа EOL вы получаете более одного символа. Попробуйте:

while (bit != null && !bit.EndsWith("\r") && !bit.EndsWith("\n") )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...