Definition
將地址綁在Socket身上。在伺服器設定中使用這個函式,可以限制連進來的IP和port;在客戶端設定中使用這個函式,可以限制連出去所使用的IP和port。
Prototype
int bind(int sockfd, struct sockaddr* addr, int addrlen);
Arguments
- sockfd - socket的描述符
- addr - 與connetc()的 server 的設定大同小異,值得一提的是s_addr,這部分常有人設定為info.sin_addr.s_addr = INADDR_ANY,INADDR_ANY表示我不在乎loacl IP是什麼,讓kernel替我決定就好。
- addrlen - 即是 *addr的大小
Return value
- 0表示綁定成功
- -1則表失敗
Problem
error message
Address already in use
方法一:
會出現這種訊息表示需要的 socket port 被佔住了,假設需要的 port 是 11111,利用指令 netstat -nlp 來查看是什麼 process 正在占用 port 11111
Proto | Recv-Q | Send-Q | Local Address | Foreign Address | State | PID/Program Name
udp 230656 0 0.0.0.0:11111 0.0.0.0:* 4858/(one process)
這時只要把該 process 做 kill (PID No) 便可以把 11111 讓出來
方法二:
bind 最常見的用法是關聯埠號和伺服器,並使用萬用字元地址(INADDR_ANY),它允許任何介面為到來的連線所使用。bind 普遍遭遇的問題是試圖繫結一個已經在使用的埠。該陷阱是也許沒有活動的套接字存在,但仍然禁止繫結埠(bind 返回 EADDRINUSE),它由 TCP 套接字狀態TIME_WAIT 引起。該狀態在套接字關閉後約保留 2 到 4 分鐘。在 TIME_WAIT 狀態退出之後,套接字被刪除,該地址才能被重新繫結而不出問題。等待 TIME_WAIT 結束可能是令人惱火的一件事,特別是如果您正在開發一個套接字伺服器,就需要停止伺服器來做一些改動,然後重啟。幸運的是,有方法可以避開 TIME_WAIT狀態。可以給套接字應用 SO_REUSEADDR 套接字選項,以便埠可以馬上重用,例如:
setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag))
沒有留言:
張貼留言