Проблема с сокетной связью - PullRequest
1 голос
/ 22 марта 2010

У меня есть два отдельных проекта сокетов в VS.NET. Один из них отправитель, другой получатель. После запуска получателя я отправляю данные от отправителя. Хотя метод send возвращает 13 байтов как успешно переданные, получатель получает 0 (ноль). Получатель принимает сокет отправителя и слушает его. Но не могу получить данные. Почему?

P.S. : Если код отправителя введен в проект получателя, получатель также может получать данные.

Ответы [ 3 ]

1 голос
/ 22 марта 2010

Мне кажется, проблема в том, что отправляющее приложение заканчивается до того, как получатель сможет прочитать данные. Если после вызова Send поставить Thread.Sleep(1000);, приложение-получатель прочитает данные (по крайней мере, когда я их проверял).

0 голосов
/ 22 марта 2010

Большое спасибо за ваш интерес. Вот код:

/ *********************************** Получатель ********** ************ /

Программа класса { static void Main (строка [] args) { Receiver recv = new Receiver (); recv.Start ();
} }

public class Receiver
{
    public void Start()
    {
        Socket gateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        gateSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999));
        gateSocket.Listen(12);

        Thread thGateListen = new Thread(new ParameterizedThreadStart(GateListener));
        thGateListen.Start(gateSocket);
    }

    public void GateListener(object obj)
    {

        Socket gateSocket = (Socket)obj;

        for (; ; )
        {
            Socket newRequest = gateSocket.Accept();
            Console.WriteLine("New Connection Request");
            Thread thReadData = new Thread(new ParameterizedThreadStart(ReadFromSocket));
            thReadData.Start(newRequest);
        }
    }


    public void ReadFromSocket(object obj)
    {
        Socket s = (Socket)obj;
        for (; ; )
        {
            if (s.Available > 0)
            {
                byte[] buffer = new byte[s.Available];
                s.Receive(buffer);
                Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer));
            }
        }
    }

}

/ *********************************** Отправитель ********** ************ /

Программа класса { static void Main (строка [] args) { Отправитель s = новый Отправитель (); s.Send («Привет, сокет!»); } }

class Sender
{
    public void Send(string s)
    {
        Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sendSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999));

        sendSocket.Send(System.Text.Encoding.ASCII.GetBytes(s));
    }

}
0 голосов
/ 22 марта 2010

Скорее всего, это ошибка в вашем коде, но без просмотра кода невозможно сказать.

Однако имейте в виду, что TCP / IP не имеет понятия сообщений, только поток данных. Таким образом, можно отправить 13 байтов и получить 6 в одном чтении и 7 в следующем. Или наоборот, чтобы отправить 13 байтов, а затем отправить еще 7 и на принимающей стороне, чтобы получить их как один блок из 20 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...