Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
  |   |   |   |   |   |   |   |   | 
Спасибо, всё верно — юзаю добавление записей в файл services, и всё гут.  05.12.08 07:38  Число просмотров: 3174
 Автор: HandleX <Александр М.> Статус: The Elderman
 | 
 
| 
 | 
 
| 
<networking>
 |  
 
По каким законам выбирается случайный порт при TCP/IP соединении?  18.03.08 11:59  
 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 18.03.08 12:01  Количество правок: 2
 | 
 
Вот сейчас смотрю свою статистику.
 
Активные подключения
  Имя    Локальный адрес        Внешний адрес          Состояние
  TCP    xxx.xxx.xxx.xxx:1477      yyy.yyy.yyy.yyy:5190      ESTABLISHED
  ---
 Видим, что система по просьбе приложения создать соединение на сервер ICQ на порт 5190 по каким-то одной ей ведомым законам воткнула обратную "слушалку" на порт 1477. Вопрос: существует ли вероятность, что создавая службу, которая "слушает" на портах, больше 1000, столкнуться с такой ситуацией, что этот порт будет совершенно случайно занят на обслуживание какого-нибудь левого соединения "наружу"? Почему никто из серверописателей "не боится" такой ситуации? Вероятность, в общем-то, достаточно большая для компьютинга.
 
 Извините, что вопрос глупый, но типо "не юзай большие номера" отвечать, конечно, можно, но не нужно.
 И заранее всем спасибо за ответы, конечно. -))
 | 
 
 
  | 
ИМХО  18.03.08 12:36  
 Автор: ZloyShaman <ZloyShaman> Статус: Elderman
 | 
 
> Вот сейчас смотрю свою статистику. >  > Активные подключения
> 
>   Имя	 Локальный адрес	Внешний адрес	      
> Состояние
>   TCP	 xxx.xxx.xxx.xxx:1477	   yyy.yyy.yyy.yyy:5190    
>  ESTABLISHED
>  ---
 > Видим, что система по просьбе приложения создать соединение > на сервер ICQ на порт 5190 по каким-то одной ей ведомым > законам воткнула обратную "слушалку" на порт 1477. 
 1477 в данном случае не открыт для входящих соединений. Сокет определяется четыремя параметрами, а не двумя. Я думаю, можешь спокойно в этой ситуации открывать порт 1477 для входящих соединений.
 | 
 
 
  |   | 
Во я тупой... Спасибо за науку! :)  18.03.08 13:16  
 Автор: HandleX <Александр М.> Статус: The Elderman
 | 
 
| 
 | 
 
 
  |   |   | 
Советую сначала проверить то, что я тебе написал.  18.03.08 13:21  
 Автор: ZloyShaman <ZloyShaman> Статус: Elderman
 | 
 
| 
 | 
 
 
  |   |   |   | 
Оопс... Не даёт забиндиться на занятый локальный порт...  18.03.08 14:08  
 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 18.03.08 14:17  Количество правок: 4
 | 
 
Вывод netstat:
 
E:\>netstat -n
Активные подключения
  Имя    Локальный адрес        Внешний адрес          Состояние
  TCP    xxx.xxx.xxx.xxx:1486      64.12.24.244:5190      ESTABLISHED
  ---
 Выполняю вот такое:
 
lib := WS2_32Library default.
s := lib socket: AF_INET type: SOCK_STREAM protocol: 0.
s asSignedInteger = SOCKET_ERROR 
    ifTrue: [^SocketError signal].
si := SOCKADDR_IN new.
si sin_family: AF_INET.
si sin_addr s_addr: (InternetAddress host: 'xxx.xxx.xxx.xxx') asParameter.
si sin_port: (lib htons: 1486).
(lib bind: s name: si yourAddress namelen: si byteSize) = SOCKET_ERROR
    ifTrue: [^SocketError signal].
  ---
 Причём WSAGetLastError возвращает "Операция успешно завершена", гы-гы-гы. Но это ложь, поскольку bind возвращает -1.
 При попытке забиндится на любой другой незанятый порт всё проходит нормально.
 | 
 
 
  |   |   |   |   | 
О как...  18.03.08 14:39  
 Автор: Ustin <Ustin> Статус: Elderman Отредактировано 18.03.08 14:51  Количество правок: 4
 | 
 
Не помню откуда, на задворках сознания вертится: 
 если добавить в C:\WINDOWS\system32\drivers\etc\services строку с crlf на конце
 
mysvc             1477/tcp    mysvc
  ---,
 то 1477 порт не будет использоваться для исходящих TCP соединений. 
 Но это необходимо проверить
 А также чем раньше поднять слушающий сокет, тем больше вероятности, что он займёт свой порт до момента его занятия чем-либо ещё.
 :( Засада, мне казалось всегда, что в подобной ситуации исходящий коннект разрывается с GetLastError=10054 или 10048, буду знать... btw, а что говорит GetLastError?
 | 
 
 
  |   |   |   |   |   | 
Да, я неправильно вытаскивал WSAGetLastError, реальная ошибка 10048.  18.03.08 15:06  
 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 18.03.08 15:06  Количество правок: 1
 | 
 
> Не помню откуда, на задворках сознания вертится:  > если добавить в C:\WINDOWS\system32\drivers\etc\services > строку с crlf на конце > ==skipped== > то 1477 порт не будет использоваться для исходящих TCP > соединений.  > Но это необходимо проверить Не представляю себе как — после перезагрузки венда выберет скорее всего другой порт... Надо порыть доки M$... Ну это не горит, как-нить попозже... А так да, ценная информация, если верная.
 
 > А также чем раньше поднять слушающий сокет, тем больше > вероятности, что он займёт свой порт до момента его занятия > чем-либо ещё. Это понятно.
 
 > :( Засада, мне казалось всегда, что в подобной ситуации > исходящий коннект разрывается с GetLastError=10054 или > 10048, буду знать... btw, а что говорит GetLastError? Subj. Вытаскивал WSAGetLastError из другого потока.
 | 
 
 
  |   |   |   |   |   |   | 
Проверить можно так:  18.03.08 15:23  
 Автор: Ustin <Ustin> Статус: Elderman Отредактировано 18.03.08 15:27  Количество правок: 1
 | 
 
- добавить запись в services
 - перегрузить Windows (по косвенным признакам - поверхностный поиск в инете - файл читается 1 раз при загрузке)
 - поднять тестовый сервак, заделать к нему кучу коннектов и набрать статистику по номерам исходящих портов
 В дальнейшем, если проверка таки пройдёт, при установке клиента установщиком добавлять указанную запись, как это делают некоторые interbase-based программы (типа http://www.dnop.sds.cn.ua/cp2000/doc/cp2000-adm-setup.shtml)
 | 
 
 
  |   |   |   |   |   |   |   | 
Проверил - работает! (не прошло и года :) )  03.12.08 21:23  
 Автор: Ustin <Ustin> Статус: Elderman
 | 
 
Столкнулся с подобной задачей - много исходящих коннектов + статистика по исходящим портам.
 Если добавить запись C:\WINDOWS\system32\drivers\etc\services вида 
 
mysvc               3333/tcp
 и перегрузиться, то после выбор идёт примерно так:
 
...
localhost:3331
localhost:3332
localhost:3334
...
  ---
 | 
 
 
  |   |   |   |   |   |   |   |   | 
Спасибо, всё верно — юзаю добавление записей в файл services, и всё гут.  05.12.08 07:38  
 Автор: HandleX <Александр М.> Статус: The Elderman
 | 
 
| 
 | 
 
 
  |   |   |   |   | 
Не знаю, что здесь написано. Но ты именно на прослушивание порт открываешь?  18.03.08 14:37  
 Автор: ZloyShaman <ZloyShaman> Статус: Elderman
 | 
 
| 
 | 
 
 
  |   |   |   |   |   | 
Сокеты создаются единообразно. А потом, чтобы "слушать", надо сделать привязку к порту функцией bind.  18.03.08 15:10  
 Автор: HandleX <Александр М.> Статус: The Elderman
 | 
 
| 
 | 
 
 
  
 
 | 
 |