Toon posts:

[linux c]Socket bind probleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben bezig met een server app. met max 5 clients. Er worden geen forks of threads gebruikt, maar een simpele select op alle open sockets.
Ik loop tegen het volgende probleem aan:
Als een client een verbinding heeft opgezet (telnet naar de poort) en de server wordt via een commando van de client gestopt,
sluit de app. eerst alle client sockets (die via accept zijn aangemaakt) en vervolgens de server socket waarna het programma beeindigt wordt.
Als ik vervolgens probeer de server app.weer te starten, krijg ik de foutmelding dat het adres al in gebruik is (EADDRINUSE); dit is hetzelfde gedrag als wanneer je probeert een tweede keer het programma te starten) Twee minuten (of zo) wachten en ik kan de server weer gebruiken.

Volgens http://www.faqs.org/faqs/unix-faq/socket/ is er weinig aan te doen (het hoort zo is mijn interpretatie van 2.7). De vraag is nu wat een nette oplossing is om dit te voorkomen. Een verzoek sturen van de server naar de client aub af te sluiten? Mijn programma (en ook ik) voelt er echter niet veel voor om te wachten to alle verbinding verbroken zijn.

Of een andere oplossing?

Gaarne advies

Omdat shadowman al gepost had terwijl ik bezig was te wijzigen, alsnog hier wat code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*****************************************************************
******************************************************************
 * NAME:      setup_server
 * FUNCTION:  setup the tcpip server for the incoming commands
 * 
 * IN:        configuration information
 * OUT:       updated configuration
 * RETURN:    -1 on error
 *            socket on success 
*****************************************************************/
int setup_server(sCFG *pCfg)
{
struct sockaddr_in servaddr;
struct hostent *hostaddr;
struct servent *srvcaddr;
char *endptr;
int port;

  // init address info
  memset(&SERVER.addr,0,sizeof(servaddr));
  SERVER.addr.sin_family=AF_INET;

  // create socket
  if((SERVER.sd=socket(AF_INET,SOCK_STREAM,0)) < 0)
  {
    logit(pCfg->logfile,pCfg->verbose,errno,"Setup server:");
    return -1;
  }

  // resolve hostname
  hostaddr=gethostbyname(SERVER.tcpip.host);
  if(hostaddr==NULL)
  {
    logit(pCfg->logfile,pCfg->verbose,0,"Setup server: error in IP-address or hostname");
    return -1;
  }
  memcpy(&SERVER.addr.sin_addr, hostaddr->h_addr, hostaddr->h_length);

  // resolve service
  port=(int)strtol(SERVER.tcpip.srvc,&endptr,10);
  if(*endptr!='\0')
  {
    srvcaddr=getservbyname(SERVER.tcpip.srvc,"tcp");
    if(srvcaddr==NULL)
    {
      logit(pCfg->logfile,pCfg->verbose,0,"Setup server: error in port-number or servicename");
      return -1;
    }
    SERVER.addr.sin_port=srvcaddr->s_port;
  }
  else
  {
    SERVER.addr.sin_port=htons(port);
  }

  // bind socket
  if(bind(SERVER.sd,
          (struct sockaddr*)&SERVER.addr,sizeof(SERVER.addr)) < 0)
  {
    logit(pCfg->logfile,pCfg->verbose,errno,"Setup server:");
    return -1;
  }

  // start listening
  if (listen(SERVER.sd,0) < 0)
  {
    logit(pCfg->logfile,pCfg->verbose,errno,"Setup server:");
    return -1;
  }
  return SERVER.sd;
}

[ Voor 126% gewijzigd door Verwijderd op 01-09-2005 11:51 ]


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
voor bind deze code zetten:

C++:
1
2
3
4
 int yes = 1;
 if (setsockopt(SERVER.sd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
   // failed to reuse address
 }

[ Voor 15% gewijzigd door Shadowman op 01-09-2005 11:45 ]


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Of een shutdown(s, SHUT_RDWR) voordat je het socket sluit.

Verwijderd

Topicstarter
Allebei zitten ze erin. Klein probleempje blijft als ik de applicatie niet sluit, maar 'restart' (waarbij dus wel alle sockets gesloten worden). Dan blijft het adres in gebruik.

Nog ideeen.

Oeps, niet goed geprogrammeerd 8)7

[ Voor 14% gewijzigd door Verwijderd op 01-09-2005 15:09 ]