sockets/struct sockaddr_in
От: Азз Украина  
Дата: 23.09.04 15:30
Оценка:
Проблема в том, что в общем ничего не работает )), ошибка и на прослушке и на аксепте естественно.

вот мой код для сокета. я так подозреваю, что не правльно заполнил структуру


if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0)
return false;

m_sMailSocket = socket(AF_INET,SOCK_STREAM,0);
m_sSock_Addr.sin_family = AF_INET;
m_sSock_Addr.sin_port = htons(110);
m_sSock_Addr.sin_addr = inet_addr("127.0.0.1");
if (listen(m_sMailSocket,1000)== SOCKET_ERROR)
return 2;
if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr,(int *)sizeof(m_sSock_Addr))==INVALID_SOCKET)
return 1;

И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.

Большое спасибо всем заранее!

24.04.05 03:05: Перенесено модератором из 'WIN API' — Alex Fedotov
Re: sockets/struct sockaddr_in
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.09.04 15:34
Оценка: -1
Здравствуйте, Азз, Вы писали:

Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.



Биндить на локальный адрес надо для того, что бы работать ТОЛЬКО с клиентами на локальной тачке.
Re: sockets/struct sockaddr_in
От: SergH Россия  
Дата: 23.09.04 15:42
Оценка:
Здравствуйте, Азз, Вы писали:

Азз>Проблема в том, что в общем ничего не работает )), ошибка и на прослушке и на аксепте естественно.


Азз>вот мой код для сокета. я так подозреваю, что не правльно заполнил структуру



Азз> if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0)

Азз> return false;

Азз> m_sMailSocket = socket(AF_INET,SOCK_STREAM,0);

Азз> m_sSock_Addr.sin_family = AF_INET;
Азз> m_sSock_Addr.sin_port = htons(110);
Азз> m_sSock_Addr.sin_addr = inet_addr("127.0.0.1");

Вроде правильно.

Азз> if (listen(m_sMailSocket,1000)== SOCKET_ERROR)

Азз> return 2;

А вот это — нет. Ты, пардон, какой порт слушаешь? А протокол? TCP, UDP, ещё чего?

Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.


А это — причина Сначала биндишся, потом, в результате, слушаешь нужный порт нужного протокола.
Делай что должно, и будь что будет
Re: sockets/struct sockaddr_in
От: butcher Россия http://bu7cher.blogspot.com
Дата: 23.09.04 15:44
Оценка:
Здравствуйте, Азз, Вы писали:

Азз>Проблема в том, что в общем ничего не работает )), ошибка и на прослушке и на аксепте естественно.

Азз>вот мой код для сокета. я так подозреваю, что не правльно заполнил структуру

    if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0)
        return false;

        m_sMailSocket = socket(AF_INET,SOCK_STREAM,0);
ZeroMemory(&m_sSock_Addr, sizeof(SOCKADDR_IN));
    m_sSock_Addr.sin_family = AF_INET;
    m_sSock_Addr.sin_port = htons(110);
/*    m_sSock_Addr.sin_addr  = inet_addr("127.0.0.1");*/
m_sSock_Addr.sin_addr.s_addr  = inet_addr("127.0.0.1");
if(bind(m_sMailSocket, (SOCKADDR*)&m_sSock_Addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    return 2;
    if (listen(m_sMailSocket,1000)== SOCKET_ERROR)
        return 2;
int nSize = sizeof(SOCKADDR_IN);
if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr, &nSize)==INVALID_SOCKET)
/*    if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr,(int *)sizeof(m_sSock_Addr))==INVALID_SOCKET)*/
        return 1;

Азз>И ешё, объясните для чего bind, msdn я по bind прочитал, но так и не понял что значит и для чего биндить сокет на локальный адрес.
bind "связывает" сокет с адресом и портом, в вашем случае это необходимо что бы система знала на какой порт и на каком интерфейсе вы хотите ждать соединений.

Нет ничего невозможного..
Re: sockets/struct sockaddr_in
От: Азз Украина  
Дата: 23.09.04 15:47
Оценка:
Адрес я даже писал так, то, что я написал в 1ом сообщении не компилиось даже.

m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

но я видело примеры кода, где без бинда обходились...
Re[2]: sockets/struct sockaddr_in
От: butcher Россия http://bu7cher.blogspot.com
Дата: 23.09.04 15:57
Оценка:
Здравствуйте, Азз, Вы писали:

Азз>Адрес я даже писал так, то, что я написал в 1ом сообщении не компилиось даже.

Азз>m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
Азз>но я видело примеры кода, где без бинда обходились...
Если вы соединятесь с сервером, при помощи connect, то функция bind вызывается неявно, связывая сокет с наиболее подходящим интерфейсом и свободным портом. Для датаграмных протоколов тоже в ряде случаев можно не связывать сокет.

Нет ничего невозможного..
Re[3]: sockets/struct sockaddr_in
От: TarasCo  
Дата: 23.09.04 16:17
Оценка: :)
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, Азз, Вы писали:


Азз>>Адрес я даже писал так, то, что я написал в 1ом сообщении не компилиось даже.

Азз>>m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
Азз>>но я видело примеры кода, где без бинда обходились...
B>Если вы соединятесь с сервером, при помощи connect, то функция bind вызывается неявно, связывая сокет с наиболее подходящим интерфейсом и свободным портом. Для датаграмных протоколов тоже в ряде случаев можно не связывать сокет.

Если быть точным, bind не вызывается неявно при подключениии к серверу. Но проще и понятней думать, что она вызывается

Кстати, если нужно, чтобы соединение "прибиндилось" не только к указанному порту, но и локальному адресу (актуально для машин с несколькими сетевыми интерфейсами) то следует указать опцию сокета SO_DONTROUTE, иначе Ваше явное указание адреса останется лишь добрым пожеланием
Да пребудет с тобою сила
Re[4]: sockets/struct sockaddr_in
От: butcher Россия http://bu7cher.blogspot.com
Дата: 23.09.04 16:41
Оценка:
Здравствуйте, 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, иначе Ваше явное указание адреса останется лишь добрым пожеланием
это мы уже где-то
Автор: small_cat
Дата: 20.08.04
проходили..

Нет ничего невозможного..
Re: sockets/struct sockaddr_in
От: Азз Украина  
Дата: 23.09.04 19:41
Оценка:
Парни, ну это всё классно..
но у меня не хотят сокеты работать )))

мне кажется что проблема здесь:

m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

я смотрю у всех остальных это выглядит по-другому:

m_sSock_Addr.sin_addr.S_addr = ...

в общем вот весь код: — может что-то лишнее, может что-то не так...хелп парни!

if (WSAStartup(MAKEWORD(1,1),&lpWSAData)==0)
{
m_sMailSocket = socket(AF_INET,SOCK_STREAM,0);

if (INVALID_SOCKET != m_sMailSocket )
{
m_sSock_Addr.sin_family = AF_INET;
m_sSock_Addr.sin_port = htons(110);
m_sSock_Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if (listen(m_sMailSocket,1)== SOCKET_ERROR)
return 2;
if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr,(int *)sizeof(m_sSock_Addr))==INVALID_SOCKET)
return 1;
return 0;
}
}
Re: sockets/struct sockaddr_in
От: vortex Украина  
Дата: 25.04.05 11:11
Оценка:
Азз пишет:

> if (accept(m_sMailSocket,(struct sockaddr *)&m_sSock_Addr,(int *)sizeof(m_sSock_Addr)??????)==INVALID_SOCKET)

> return 1;
Вот там и падает.
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.