Сокет не отвечает (сокет отвечает только один раз...)

Модератор: Модераторы разделов

ilya--

Сокет не отвечает

Сообщение ilya-- »

:P Когда запускаю прогу 1ый раз, то она исправно отвечает на запрос и завершается.
Второй раз запускается без ошибок(по крайней мере тех, которые я обработал), но на
запросы отвечать отказывается. При обращении по соответствующему адресу telnet
говорит что ТИПА сервер не создан и .т.п. Никакая другая прога с данным портом не работает.
В чём же проблема??

Код: Выделить всё

#include <sys/signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
int main(void){
   struct sockaddr_in name, name_2;
   int sock, acc, pid;
   char msg_in[10000];
   char msg_out[1000]="Message from <exx>\0";
   size_t sizecl;
/*Ignore TERMINAL I/O signals*/
// signal(SIGTTOU, SIG_IGN);
// signal(SIGTTIN, SIG_IGN);
// signal(SIGTSTP, SIG_IGN);
/*EnD:  Ignore TERMINAL I/O signals*/
// pid=fork();
// if(pid!=0) exit(0);
// setsid();
// signal(SIGHUP, SIG_IGN);
//socket
   if((sock=socket(PF_INET, SOCK_STREAM, 0))<0){
      printf("sock FAILED");
   }
   name.sin_family=AF_INET;
   name.sin_port=htons(30);
   name.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
   if((bind(sock, (struct sockaddr *)&name, sizeof(name)))<0){
      printf("bind FAILED");
   }
   if(listen(sock,1)<0){
      printf("listen FAILED");
   }
   if((acc=accept(sock, (struct sockaddr *)&name_2, &sizecl))<0){
      printf("accept FAILED");
   }
   read(acc, msg_in, 10000);
   if(shutdown(acc,0)<0){
      printf("shutdown FAILED");
   }
   if(close(acc)<0){
      printf("close FAILED");
   }
   if(close(sock)<0){
      printf("close-2 FAILED");
   }
/*process an input data*/
/* sock=socket(PF_INET, SOCK_STREAM, 0);
   name.sin_family=AF_INET;
   name.sin_port=htons(31);
   name.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
   connect(sock, (struct sockaddr *)&name, sizeof(name));
   write(sock, msg_out, strlen(msg_out));
   shutdown(sock, 1);
   close(sock);*/
/*EnD: process an input data*/
// if(pid != 0) exit(0);
   return 0;
}

:wacko: :wacko:
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Сокет не отвечает

Сообщение xorader »

lsof -i -- что говорит ?
и/или netstat -l -n -p
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
ilya--

Re: Сокет не отвечает

Сообщение ilya-- »

С помощью netstat -l -n -f кое-что выяснил. Когда процесс запускается первый раз, то садится
на порт 30(как и видно из программы). Всё без проблем выполняется и завершается. Но второй
раз прога садится не на 30 порт, а на какой-то 1043, или 1030 и т.д. Естесственно что до неё
не получается достучаться на 30 порт телетом. Вопрос: почему так? :megalol:
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Сокет не отвечает

Сообщение Shura »

может по каким-то причинам порт не освобождается?
Кстати, порты < 1024 может открывать только root кажется.
Rock'n'roll мертв © БГ
Спасибо сказали:
ilya--

Re: Сокет не отвечает

Сообщение ilya-- »

(Shura @ Пятница, 04 Марта 2005, 15:53) писал(а):может по каким-то причинам порт не освобождается?
Кстати, порты < 1024 может открывать только root кажется.

:wacko: По каким причинам не освобождается, например?(желательно
учитывать текст приведенной выше программы)
А порты я пробовал и >1024, всё равно не пашет.
ilya-- добавил в 04.03.2005 20:38
Выяснилось, что при втором и последующих запусках происходит bind failed. ПОчему?
Когда закрываешь консоль и пробуешь снова, то всё работает. <_<
Спасибо сказали:
Ananas
Сообщения: 64

Re: Сокет не отвечает

Сообщение Ananas »

man setsockopt
man 7 socket

на предмет SO_REUSEADDR
Спасибо сказали: