LINUX.ORG.RU

Sockets


0

0

Вот такая проблема.
Надо написать небольшой сервер.
Если указать IP localhosta (INADDR_ANY), то все оки, а если указывать свой, то возникает Bind error: can't assign address
вот кусок кода с localhost (рабочий)
struct sockaddr_in server = {AF_INET, 1200, INADDR_ANY};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket error");
exit(1);
}
if (bind(sockfd, (struct sockaddr *)&server, SIZE) == -1) {
perror("Bind error");
exit(1);
}
А вот нерабочий с моим IP (не localhost'a)
struct sockaddr_in server = {AF_INET, 1200, inet_addr("192.168.1.1")};
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket error");
exit(1);
}
if (bind(sockfd, (struct sockaddr *)&server, SIZE) == -1) {
perror("Bind error");
exit(1);
}
Проблема в том, что если указать INADDR_ANY, то 1200 порт не открывается...
Помогите его открыть.
Заранее спасибо

1. Не въехал:

> Если указать IP localhosta (INADDR_ANY), то все оки, а если указывать свой,
> то возникает Bind error
...
> Проблема в том, что если указать INADDR_ANY, то 1200 порт не открывается.
Так что работает, а что - нет?

2. INADDR_ANY - это НЕ IP localhosta, а (кто бы мог подумать! :) )
ЛЮБОЙ IP адрес, связанный с данным хостом (ну, может же несколько карточек
стоять), в том числе и localhost. Так что тебе как раз его и надо пользовать.

3. Хвост у адреса надо заполнять нулями (типа memset(&(server.sin_zero),'\0',8);)
4. Все чиселки неплохо бы заhton'ить, хотя бы порт: htons(1200).
(Сдается мне, все у тебя работает, только вот не на том порту;)

5. Если не заработало, спробуй феньку (хотя вряд ли она поможет):
int yes=1;
/*char yes='1'; for Solaris*/
setsockopt(sockfd ,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int));

Die-Hard ★★★★★
()

INADDR_ANY это адрес соответствующий всем интерфейсам компьтера (lo, eth0, ppp0 и.т.п.)
А тебе надо ввести адрес соответтвующей опеределенному интерфейсу.
Если ты его оставишь как строку с точками получится фигня, потому что
он должен быть в виде 32 битового числа 8-).
Надо бы IP для начала перевести
в сетевой вид
inet_addr("твой IP");
А номер порта в сетевой порядок байт функцией
htons(1200);
функции gethostbyname() и похожие возвращаю значения в правильном порядке байт, и адрес в сетевом виде.

OxiD ★★★★
()

2OxiD (*) (2002-09-07 11:01:33.13):
Ну ладно, мой ответ читать было лень. Но - ты оригинал-то прочел?

OxiD:
> Если ты его оставишь как строку с точками получится фигня,
> Надо бы IP для начала перевести в сетевой вид inet_addr("твой IP");
Compare:

OgreSwamp:
> inet_addr("192.168.1.1")

Не понимаю - что, "чукча не читатель, чукча - писатель"!:)?

Die-Hard ★★★★★
()

В том то и дело, что ничего не открывается :( Немного проясню ситуацию. При использовании INADDR_ANY в сервере и клиенте (клиент стоит на той-же машине), все работает, но TCP порт не открывается. Я вообще этого понять не могу. И netstat запускал, и nmap, все равно не нашел нового открытого порта. С bind error разобрался. Запустил сервер из-под root, ошибка исчезла, сервер стартанул, но порт так и не открылся. Спасибо за помощь, сегодня попробую использовать ваши оветы, мб что и получится....

OgreSwamp
() автор топика

Все, спасибо htons помог :)

OgreSwamp
() автор топика

>И netstat запускал, и nmap, 
>все равно не нашел нового открытого порта
а ты listen(int) пробовал перед accept() поставить ;)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.