none
Метод Bind() или как привязать точку к сокету??? RRS feed

  • Вопрос

  • Уважаемые знатоки!

    Поднимаю белый флаг, и прошу помощи!

    Создаю c# приложение которое должно общаться с удаленным сервером по протоколу UDP. 

    Код: 

    int recv; 
                byte[] data = new byte[1024];
    
                Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    
                // "слушаем" порт 9050
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
                mysocket.Bind(ipep); //привязываем точку к нашему сокету
                IPEndPoint sender = new IPEndPoint(IPAddress.Parse("111.111.111.111"), 9997);//адрес сервака
                EndPoint Remote = (EndPoint)(sender);
             
                
                while (true)
                {
                    data = new byte[1024];
                   
                    recv = mysocket.ReceiveFrom(data, ref Remote);
                    string message = Encoding.UTF8.GetString(data, 0, recv);
                    Console.Write(message);
                    
                }
     

    Когда сервер шлет что-нить на порт 9050, программа никак не реагирует!

    Но, когда мы сначала что-то ему пошлем...

    byte[] msg = System.Text.Encoding.UTF8.GetBytes("begin_out");
                
                mysocket.SendTo(msg, Remote);

    то все работает на отлично. Вот только порт не 9050!!! с каждым стартом программы порт разный (сервер запоминает порт отправителя и на него шлет ответ) А мне кровь с носа как нужен этот порт!!!

    Добрые люди, помогите советиком! А еще лучше примерчиком:)

    17 марта 2014 г. 19:01

Ответы

  • может проблема в роутере?

    Вполне возможно. В роутере должен быть настроен "проброс" портов. А вообще, код приема-передачи лучше отлаживать, когда сервер и клиент работают в одной локальной сети, а лучше на одной машине. Когда добьетесь работоспособности кода, можно и настройкой роутера заняться. А так получается задача со многими неизвестными :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа bpigadip 18 марта 2014 г. 13:39
    18 марта 2014 г. 5:58

Все ответы

  • Может быть так?

    UdpClient cl = new UdpClient(9050);
    IPEndPoint rep = new IPEndPoint(IPAddress.Parse("111.111.111.111"), 9997);
    
    for (;;)
    {
    	byte[] data = cl.Receive(ref rep);
    	// ...
    }
    


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 марта 2014 г. 20:35
  • нет, так я тоже пробовал... не реагирует:(

    может проблема в сервере? вот кусок кода отвечающий за это: (PHP)

    $adminIP = "10.10.10.10";
     $adminPort = 9050;//по умолчанию
    
    while(1)
    {
        echo "Waiting for admin commands... \n";
         
        //Receive some data
        $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
        
        if ($buf == "begin_out") {//получаем команду от клиента
            echo "Admin is connected!\nAdmin IP: $remote_ip\nAdmin Port: $remote_port\n";
            $adminIP = $remote_ip;//назначаем Ip переменной
            $adminPort = $remote_port;//назначаем порт переменной
             if( ! socket_sendto($sock, $adminPort , strlen($adminPort) , 0 , $adminIP , $adminPort))//отправляем назад порт
        {
            //errorы
        }
        }
    }
    //если работать дальше с сервером через полученный порт
    //то все ок. 
    //если просто попытаться отправить данные на заранее известные координаты, то нихера не получается(((
     $adminIP = "10.10.10.10";
     $adminPort = 9050;
    if( ! socket_sendto($sock, $SOME_DATA , strlen($SOME_DATA) , 0 , $adminIP , $adminPort))//бьемся головой об стену...
        {
            //errorы
        }

    17 марта 2014 г. 21:05
  • А брандмауэр на стороне клиента разрешает прием по данному порту?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 марта 2014 г. 21:34
  • брандмауер вообще отключен как служба. антивирус не блокирует. может проблема в роутере? ведь айпи ведет к роутеру, а потом по внутренней сети. короче я полностью запутался...

    в принципе, есть действующий пример, но не хочется писать кучу говнокода в стиле "подключись к серверу, узнай порт, запомни порт и тд"   

    17 марта 2014 г. 21:55
  • может проблема в роутере?

    Вполне возможно. В роутере должен быть настроен "проброс" портов. А вообще, код приема-передачи лучше отлаживать, когда сервер и клиент работают в одной локальной сети, а лучше на одной машине. Когда добьетесь работоспособности кода, можно и настройкой роутера заняться. А так получается задача со многими неизвестными :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа bpigadip 18 марта 2014 г. 13:39
    18 марта 2014 г. 5:58