我正面臨綁定到套接字的這個問題。 第一個實例正常工作,即 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或邏輯(代碼而不是命令的錯誤沒有消失,甚至除了直接殺死進程之外)處理這種情況?
你是(錯誤地)關閉一個接受的客戶端套接字,但你是否也關閉了偵聽服務器套接字?您不能將新的TCP套接字綁定到與先前套接字仍然綁定的IP /端口相同的IP /端口。你爲什麼試圖將多個套接字綁定到同一個IP /端口? –
感謝您的意見。 是的,我在客戶端和服務器套接字中調用close。 同樣的邏輯是我的服務器線程是一個應用程序的一部分,它是基於成功啓動我創建服務器線程的應用程序的一部分。即使在我的應用程序關閉後,此線程也不必不必要地處於活動狀態。要處理此情況,我嘗試了在調用pthread_exit時關閉套接字。 就客戶而言,我認爲可以在客戶完成其工作時致電關閉。 如果我的邏輯看起來不正確,請糾正我的錯誤。 – user5729621
你顯然沒有正確地關閉所有東西。有些東西仍然是開放的。請提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),顯示如何管理所有套接字。 –