Есть клиент:
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <resolv.h>
int main(int argc, char *parms[])
{
int sock;
struct sockaddr_in addr;
sock=socket(PF_INET, SOCK_STREAM, 0);
char in_letter, out_letter;
if (argc==3)
{
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
inet_addr(parms[1], &addr.sin_addr.s_addr);
addr.sin_port=htons(atoi(parms[2]));
printf("Remote destination: %s:%s\n", parms[1], parms[2]);
}
else { printf("So much parms!\n"); exit(0); };
if (connect(sock, (struct sockaddr *) &addr, sizeof(addr))!=0)
{ perror("Connect Error"); exit(0); };
int size=sizeof(addr);
char buffer[1024];
do
{
scanf("%s", buffer);
send(sock, buffer, strlen(buffer),0);
} while (!(strncmp("bye", buffer, 4)==0);
return(0);
}
есть сервер:
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <resolv.h>
int main()
{ int sock;
struct sockaddr_in addr;
sock=socket(PF_INET, SOCK_STREAM, 0);
char in_letter, out_letter;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port=htons(2000);
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
printf("Bind OK\n");
listen(sock,20);
printf("Listen OK\n");
for (;;)
{
int clientsd;
int size=sizeof(addr);
clientsd=accept(sock, (struct sockaddr*)&addr, &size);
printf("Connection OK\n");
if (clientsd>0)
{
char buffer[1024];
int nbytes;
do
{
nbytes=recv(clientsd, buffer, sizeof(buffer), 0);
if (nbytes>0)
printf("%s",buff);
} while (!(nbytes>0 && strncmp("bye\r", buffer, 4)==0);
close(clientsd);
}
printf("Connetion broken\n");
}
return(0);
}
Проблема такова: если запускаю сервер на локальном компьютере,
потом соединяюсь клиентом, то все работает. НО! Есть сеть из 12
компьютеров, они соедены через хаб, на одном делаю:
ifconfig eth0 up 192.168.50.1 netmask 255.255.255.0
на втором: ifconfig eth0 up 192.168.50.2 netmask 255.255.255.0
запускаю сервер на 192.168.50.1 и на 192.168.20.2 тоже, потом
пытаюсь соединиться: ./client 192.168.50.2 2000 (соединяюсь
с первой машины). И что я вижу: тот к кому я пытаюсь присоединиться
молчит, а соединяюсь я сам с собой, причем сообщения шлються
тоже мне. Почему так?.
писюн, согласно логике твоей программы на экране должно быть
либо это:
printf("Remote destination: %s:%s\n", parms[1], parms[2]);
либо это:
printf("So much parms!\n");
если ты об этом то да, выводится именно это,
здесь всё прекрасно. Но работает она неправильно в сети,
однако вот если я пробую на локальном компе, то всё хорошо.
>ты что издеваешься?
конечно, решил поиздеваться над вами =).
>что _именно_ пишется?
>(printf("Remote destination: %s:%s\n", parms[1], parms[2]);
смотри глубже =). Нам нахрен не нужен этот принтф, если
запустим ./client 127.0.0.1 2000, то будет
printf("Remote destination: %s:%s\n", parms[1], parms[2]),
если же ./client 127.0.0.1, то будет printf("So much parms!\n");
понял? =). Но вопрос не про то совсем. Все это прекрасно
компилируется и _работает_ на локальном компьютере, но,
ещё раз говорю, что когда делаю это в сетке, то мы наблюдаем
то, что я попытался описать в конце самого первого моего поста.
То есть попросту не шлются сообщения куда надо. От вас же я хочу, чтобы вы ткнули носом почему так происходит. А netstat и tcpdump не покажу, сейчас нет этих всех компьютеров, где линукс стоит и где я пробывал. Млин, надеюсь, понятно хоть рассказал..
Значит так ты может для начала сделаешь проверку корректности завершения все операций работы с сокетом?
А то у тебя везде "ок"! Поверяй завершение всех операций! А потом уже в форум шастай он у тебя как сказали раньше в сетке может не иметь таблиц маршрутизации из-за этого и гонит, а то, что он отсылает, так это уже твой баг функции не зря значения возвращают!
-----
зы Ты случаем не студент?
>Перед коннектом (или после:))) выведи чего там у тебя на клиенте в
>sock_addr... такое ощущение что ты IP таки не установил у клиента.
хорошо, щас посмотрю. А все-таки, если бы я не установил у клиента IP,
то почему на локальной тачке работает?
да, ты оказался прав! Ура!..Хоть немного продвинулся.
После того как bzero обнулил структуру, ему по*ать что
я пытался в addr.sin_addr.s_addr "впихнуть" IP.
Ну и конечно и до и после connect() у меня в
addr.sin_addr.s_addr "null". Теперь осталось узнать,
где я напартачил.. Идеи есть? Вроде все нормально..
>Почитай man на inet_addr, обращая внимание на количество параметров.
заменил inet_addr на inet_aton, получилось:
inet_aton(parms[1], &addr.sin_addr.s_addr);
тепрь нахрен вылетает с сегфолтом.
а если так: &addr.sin_addr.s_addr=inet_addr(parms[1]);
то в s_addr все равно null. Что-то я сильно туплю сегодня =(.