TCP: возможно ли связать сокет и затем / оба / подключиться к нему и принять от него (как правила клиента, так и сервера)? - PullRequest
3 голосов
/ 25 августа 2011

возможно ли на любой распространенной платформе, скажем, в Windows, написать обслуживающий процесс, который создает сокет, привязывает его только к одному локальному «адресу: порту» (фиксированному), а затем:

  • использовать его для прослушивания входящих соединений (на указанном порту), в то время как в то же время
  • использовать его в качестве клиентского сокета для подключения к другому серверу (с идентичным исходным портом)к тому, который он предоставляет другим)?

, то есть (извините за нарушение синтаксиса):

mySocket = socket ();mySocket.bind ( myaddress , 3000);mySocket.connectTo ( сосед , независимо от порта );// и представить другим как порт 3000 mySocket.listen ();// и он прослушивает 3000 mySocket.accept ();

?

iirc, попробовать даже не представляется возможным / нежелательно, даже если API не будет жаловаться, но, возможно,это я слишком много играю в книге ... поэтому я подумал спросить тебя

большое спасибо!

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

И если бы вы могли, возникнут всевозможные неприятности.Например, если select () возвращает, что сокет доступен для чтения, вы делаете recv () или accept ()?Вы хотите, чтобы две розетки играли эти две роли.

Какое преимущество есть в одной розетке?Например, если вы надеялись выполнить блокирующее чтение, пока не произойдет что-то интересное (входящее соединение, входящие данные), есть альтернативы.В этом примере вы бы использовали select () для блокировки сразу двух сокетов.Результат от select () говорит вам, какой сокет готов.Это говорит вам, если вы хотите принять () новое соединение из одного сокета или recv () новые данные из другого сокета.

2 голосов
/ 26 августа 2011

Нет, сокет нельзя использовать для одновременного прослушивания и подключения.connect() вернет ошибку WSAEINVAL, если listen() уже был вызван, и listen() вернет ошибку WSAEISCONN, если connect() уже был вызван.Вам нужно использовать отдельные розетки.

...