作者mcamory (一切都是真的!!)
看板NTUIM-14
标题[网路应用与技术] PA#1 问题回应3
时间Tue Nov 14 23:08:59 2006
bind常发生的错误是EADDRINUSE([Address already in use]),
解决方式可在bind前加入以下两行
int one = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
bind(listenfd, serv_addr, len) <---这边是正常程序的bind
SO_REUSEADDR使得即使先前建立的连线仍然存在,
并且使用这个port作为listening port,而仍然能允许listen的server启动。
这种情形常发生在以下情境:
a) server activates and listens on some port
b) a connection arrives and server fork a process to handle the connection
c) server terminates but child process is still serving the connection
d) reactivates the server
根据预设 当d发生时 server的listen的动作会重新启动,并呼叫:socket, bind, listen
但此时bind就会出问题...因为server在尝试bind一个现在仍属於现存连线一部份的port,
这时候就设定socket选项为 SO_REUSEADDR就可以了。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.107.41
※ 编辑: mcamory 来自: 140.112.107.41 (11/14 23:09)