2017-08-01 66 views
0

函數close(套接字)在客戶端,服務器得到哪個返回值? 每當我關閉客戶端的連接時,我的服務器也會關閉,當我嘗試重新打開它時,我得到: bindind套接字中的錯誤:Addadress Alreasy正在使用中。Linux:套接字和綁定問題

但我在我的服務器上使用此功能:

n = read(newsockfd, buffer, sizeof(buffer)); 
if (n < 0) errore("Errore lettura Socket"); 
if (n == 0) 
        { 
int true = 1; 
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)); 
shutdown(sockfd, SHUT_RDWR); 
close(sockfd); 

} 
+0

它通常是需要的服務器s來設置'SO_REUSEADDR',而不是客戶端。 – Alnitak

+0

是的,這是來自服務器端的代碼 – Emperon

+0

'setsockopt'調用應該在您創建套接字時進行 - 它不應該在您從客戶端 –

回答

1

要允許重新綁定到相同的地址,SO_REUSEADDR選項必須在服務器套接字上已經創建後啓用,但bind()前呼叫,因爲它是撥打bind,實際上試圖將新創建的套接字附加到其預期的IP地址和端口,即

s = socket(...); 
result = setsockopt(s, SO_REUSEADDR, ...); 
result = bind(s, ...);