socket端新增地址複用
阿新 • • 發佈:2019-01-08
傳智掃地僧課程學習筆記。
實驗1,
執行之前的伺服器程式後,
再執行一個,
會提示: Address already in use,意即埠被佔用,這個沒什麼好說的,
實驗2,
執行伺服器程式,執行客戶端程式,
然後結束伺服器程式,
注意了啊,這時候你再開啟伺服器程式,會提示和上面一樣的錯誤,
這時候你用 netstat -na | grep 8001,
這時候,仍然有資訊回來,
如下,
結論就是,處於類似的狀態你,你再次啟動伺服器程式,無法啟動,
所以有這樣一個技術,
setsockopt,在bind之前呼叫,
之後你再啟動伺服器程式,就不會提示錯誤了,
不過這時候估計是因為之前的連線已經斷了,所以你繼續從客戶端發信息,會沒有迴應,
這時候你重新啟動客戶端,就又像之前一樣正常收發資料了,
int optval = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))
< 0)
{
perror("setsockopt bind\n");
exit(0);
}
if( bind( sockfd, (struct sockaddr *)&srvaddr, sizeof( srvaddr)) <0)
{
perror("socket\n");
exit( 0);
}