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:
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 ]