2015-12-30 39 views
1

我正面臨綁定到套接字的這個問題。 第一個實例正常工作,即 socket()返回成功,因此返回bind()和listen(),accept(),因此recv() - 一切正常,直到這裏。 二次拋出錯誤,同時綁定「地址已經在使用」套接字錯誤::地址已被使用

我經歷了所有這個帖子,我沒有看到任何具體的解決方案提供了相同的。

我的代碼如下: -

if((status = getaddrinfo(NULL,"8080",&hints,&servinfo))!=0){ 
     ALOGE("Socket:: getaddrinfo failed %s\n",strerror(errno)); 
     return NULL; 
    } 

    server_sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol); 
    if(server_sockfd == -1) { 
     ALOGE("Socket:: Scoket System Call failed %s\n",strerror(errno)); 
     return NULL; 
    } 

    if ((setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int))) < 0) 
    { 
     ALOGE("Socket:: setsockopt failed %s\n",strerror(errno)); 
     return NULL; 
    } 

    ret = bind(server_sockfd, servinfo->ai_addr,servinfo->ai_addrlen); 
    if(ret!=0) { 
     ALOGE("Socket:: Error Binding on socket %s\n",strerror(errno)); 
     return NULL; 
    } 

此代碼在Android平臺上運行。

我已經正確如下打開一個新的會話之前關閉每個會話: -

ret = shutdown(client_sockfd,0); 
if(ret != 0) 
    ALOGE("Socket:: Shutdown Called%s\n",strerror(errno)); 

我試圖接近,以及,但它沒有工作。

令人驚訝,當我們嘗試打開插座很長一段時間後(按TIME_WAIT邏輯)

任何人都可以請指引我正確的電話或API或邏輯(代碼而不是命令的錯誤沒有消失,甚至除了直接殺死進程之外)處理這種情況?

+1

你是(錯誤地)關閉一個接受的客戶端套接字,但你是否也關閉了偵聽服務器套接字?您不能將新的TCP套接字綁定到與先前套接字仍然綁定的IP /端口相同的IP /端口。你爲什麼試圖將多個套接字綁定到同一個IP /端口? –

+0

感謝您的意見。 是的,我在客戶端和服務器套接字中調用close。 同樣的邏輯是我的服務器線程是一個應用程序的一部分,它是基於成功啓動我創建服務器線程的應用程序的一部分。即使在我的應用程序關閉後,此線程也不必不必要地處於活動狀態。要處理此情況,我嘗試了在調用pthread_exit時關閉套接字。 就客戶而言,我認爲可以在客戶完成其工作時致電關閉。 如果我的邏輯看起來不正確,請糾正我的錯誤。 – user5729621

+0

你顯然沒有正確地關閉所有東西。有些東西仍然是開放的。請提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),顯示如何管理所有套接字。 –

回答

1

A socket is one half a channel of communication between two computers over a network on a particular port. (the other half is the corresponding socket on the other computer)

錯誤非常明顯我想在這種情況下。正如所提到的Address already in use,所以你試圖在第二次嘗試連接的套接字已經被使用(端口已被佔用) - >也許是由於第一次套接字連接。

爲了進一步研究驗證其他SO question herehere

+0

Thanks.Indeed錯誤是明確的,因爲我提到。但我想重新使用相同的端口,我甚至無法在調用close(以及shutdown())之前嘗試重新打開它。上述所有close()doe snot第一次返回任何錯誤。如果關閉失敗,則close應該拋出錯誤,請求的fd無法關閉。保留我的查詢。 – user5729621

+0

@ user5729621您可以發佈您關閉之前打開的套接字的代碼片段嗎? –

+0

我已經發布了相同的內容。我的意思是我嘗試了關閉Api和關閉Api,但接下來的綁定反覆出現錯誤。此外,我已嘗試與另一個端口號,但它拋出相同的錯誤 – user5729621

0

您不能共享,甚至與SO_REUSEADDR兩個進程之間的TCP監聽端口。

NB shutdown()不會關閉TCP會話。它將其關閉一半。你必須關閉套接字。

+0

該OP說:「*我試着靠近,但它沒有奏效。*」 –

+0

@RemyLebeau確實。很難理解爲什麼他會爲'shutdown()'困擾,爲什麼他最初不使用'close()'。 – EJP

相關問題