Здравствуйте, Азз, Вы писали:
Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.
Биндить на локальный адрес надо для того, что бы работать ТОЛЬКО с клиентами на локальной тачке.
Здравствуйте, Азз, Вы писали:
Азз>Проблема в том, что в общем ничего не работает )), ошибка и на прослушке и на аксепте естественно.
Азз>вот мой код для сокета. я так подозреваю, что не правльно заполнил структуру
Вроде правильно.
Азз> if (listen(m_sMailSocket,1000)== SOCKET_ERROR) Азз> return 2;
А вот это — нет. Ты, пардон, какой порт слушаешь? А протокол? TCP, UDP, ещё чего?
Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.
А это — причина Сначала биндишся, потом, в результате, слушаешь нужный порт нужного протокола.
Здравствуйте, Азз, Вы писали:
Азз>Проблема в том, что в общем ничего не работает )), ошибка и на прослушке и на аксепте естественно. Азз>вот мой код для сокета. я так подозреваю, что не правльно заполнил структуру
Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.
bind "связывает" сокет с адресом и портом, в вашем случае это необходимо что бы система знала на какой порт и на каком интерфейсе вы хотите ждать соединений.
Здравствуйте, Азз, Вы писали:
Азз>Адрес я даже писал так, то, что я написал в 1ом сообщении не компилиось даже. Азз>m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); Азз>но я видело примеры кода, где без бинда обходились...
Если вы соединятесь с сервером, при помощи connect, то функция bind вызывается неявно, связывая сокет с наиболее подходящим интерфейсом и свободным портом. Для датаграмных протоколов тоже в ряде случаев можно не связывать сокет.
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, Азз, Вы писали:
Азз>>Адрес я даже писал так, то, что я написал в 1ом сообщении не компилиось даже. Азз>>m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); Азз>>но я видело примеры кода, где без бинда обходились... B>Если вы соединятесь с сервером, при помощи connect, то функция bind вызывается неявно, связывая сокет с наиболее подходящим интерфейсом и свободным портом. Для датаграмных протоколов тоже в ряде случаев можно не связывать сокет.
Если быть точным, bind не вызывается неявно при подключениии к серверу. Но проще и понятней думать, что она вызывается
Кстати, если нужно, чтобы соединение "прибиндилось" не только к указанному порту, но и локальному адресу (актуально для машин с несколькими сетевыми интерфейсами) то следует указать опцию сокета SO_DONTROUTE, иначе Ваше явное указание адреса останется лишь добрым пожеланием
Здравствуйте, TarasCo, Вы писали:
TC>Если быть точным, bind не вызывается неявно при подключениии к серверу. Но проще и понятней думать, что она вызывается
аха.. вызывается WSPBind, это для ws2_32, насчёт старых версий не знаю..
// If this socket is not yet bound to an address, bind it to an
// address. We only do this if the helper DLL for the socket supports
// a get wildcard address routine--if it doesn't, the app must bind
// to an address manually.
...
result = WSPBind(
Handle,
sockaddr,
sockaddrLength,
&err
);
...
TC>Кстати, если нужно, чтобы соединение "прибиндилось" не только к указанному порту, но и локальному адресу (актуально для машин с несколькими сетевыми интерфейсами) то следует указать опцию сокета SO_DONTROUTE, иначе Ваше явное указание адреса останется лишь добрым пожеланием
это мы уже где-то
Азз пишет:
> if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr,(int *)sizeof(m_sSock_Addr)??????)==INVALID_SOCKET) > return 1;
Вот там и падает.