2021年6月17日 星期四

【SOCKET】bind函式

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)) 



沒有留言:

張貼留言