LINUX.ORG.RU

Клиент, сервер и их правильная работа.


0

0

Есть клиент:

#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 (соединяюсь
с первой машины). И что я вижу: тот к кому я пытаюсь присоединиться
молчит, а соединяюсь я сам с собой, причем сообщения шлються
тоже мне. Почему так?.

Ответ на: комментарий от anonymous

читай в конце моего поста. Она ничего ни пишет, просто работает не как нужно.

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

писюн, согласно логике твоей программы на экране должно быть
либо это:
printf("Remote destination: %s:%s\n", parms[1], parms[2]);
либо это:
printf("So much parms!\n");

if (argc==3)
{
........

printf("Remote destination: %s:%s\n", parms[1], parms[2]);
}
else { printf("So much parms!\n"); exit(0); };

anonymous
()
Ответ на: комментарий от anonymous

если ты об этом то да, выводится именно это,
здесь всё прекрасно. Но работает она неправильно в сети,
однако вот если я пробую на локальном компе, то всё хорошо.

pisun
() автор топика
Ответ на: комментарий от pisun

> если ты об этом то да, выводится именно это,

ты что издеваешься? что _именно_ пишется? (printf("Remote destination: %s:%s\n", parms[1], parms[2]);

пока ты грамотно не сформулируешь вопрос тебе никто не сможет ответить!!!


что показывает netstat -ta?
что показывает tcpdump?


anonymous
()
Ответ на: комментарий от anonymous

>ты что издеваешься?
конечно, решил поиздеваться над вами =).

>что _именно_ пишется?
>(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 не покажу, сейчас нет этих всех компьютеров, где линукс стоит и где я пробывал. Млин, надеюсь, понятно хоть рассказал..

pisun
() автор топика
Ответ на: комментарий от pisun

скорее всего у тебя на машине не настроена маршрутизация!

Ответ на вопрос ты получишь только тогда когда скжешь в какой точке программы появляется ошибка и что пишет отладочный вывод!!!

Тебе нужно найти место где что-то раьботает не так!!

Я подозреваю что это либо маршрутизация - connect выходит с ошибкой скорее всего, а ты ее не проверяешь!!!

anonymous
()
Ответ на: комментарий от pisun

Значит так ты может для начала сделаешь проверку корректности завершения все операций работы с сокетом?

А то у тебя везде "ок"! Поверяй завершение всех операций! А потом уже в форум шастай он у тебя как сказали раньше в сетке может не иметь таблиц маршрутизации из-за этого и гонит, а то, что он отсылает, так это уже твой баг функции не зря значения возвращают! ----- зы Ты случаем не студент?

anonymous
()
Ответ на: комментарий от anonymous

Маршрутизация, говорите? Пакеты идут.
Всё-таки, плиз, может кто увидал грубую ошибку?
Он и соединяется, только не с тем сервером.

>Ты случаем не студент?
Это не лаба =). Это просто так - для себя.

pisun
() автор топика
Ответ на: комментарий от pisun

Перед коннектом (или после:))) выведи чего там у тебя на клиенте в sock_addr... такое ощущение что ты IP таки не установил у клиента.

AIv ★★★★★
()
Ответ на: комментарий от AIv

>Перед коннектом (или после:))) выведи чего там у тебя на клиенте в
>sock_addr... такое ощущение что ты IP таки не установил у клиента.
хорошо, щас посмотрю. А все-таки, если бы я не установил у клиента IP,
то почему на локальной тачке работает?

pisun
() автор топика
Ответ на: комментарий от AIv

да, ты оказался прав! Ура!..Хоть немного продвинулся.
После того как bzero обнулил структуру, ему по*ать что
я пытался в addr.sin_addr.s_addr "впихнуть" IP.
Ну и конечно и до и после connect() у меня в
addr.sin_addr.s_addr "null". Теперь осталось узнать,
где я напартачил.. Идеи есть? Вроде все нормально..

pisun
() автор топика
Ответ на: комментарий от pisun

> От вас же я хочу, чтобы вы ткнули носом почему так происходит.

Почитай man на inet_addr, обращая внимание на количество параметров.

anonymous
()
Ответ на: комментарий от pisun

>Почитай 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. Что-то я сильно туплю сегодня =(.

pisun
() автор топика
Ответ на: комментарий от pisun

>а если так: &addr.sin_addr.s_addr=inet_addr(parms[1]);

Почитай man на inet_addr, обращая внимание на тип результата.

>Что-то я сильно туплю сегодня =(.

Сложно спорить.

Кроме того, я не совсем понимаю, из каких соображений ты не включаешь нужные заголовочные файлы.

anonymous
()
Ответ на: комментарий от pisun

>Нахрен inet_addr! inet_aton - рулит =)

Ну вот и правильно, а то inet_addr может вернуть -1 и будет весело.

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