2014-10-10 95 views
0

我正在創建服務器/ clinet,但我遇到了問題。如果我第一次啓動服務器和客戶端,everthing可以正常工作。然後關閉它們,幾秒鐘後再次啓動它們,並在客戶端收到「連接被拒絕」錯誤。我總是先啓動服務器,然後啓動客戶端。這是代碼。 DoLogin是一個簡單的函數,具有2個讀取和2個寫入。這段代碼有什麼問題?C插座 - 第二次嘗試拒絕連接

server.c

int main(){ 
    int ds_sock; 
    struct sockaddr_in my_addr; 
    ds_sock=socket(AF_INET,SOCK_STREAM,0); 

    memset(&my_addr,0,sizeof(my_addr)); 
    my_addr.sin_family=AF_INET; 
    my_addr.sin_port=htons(25000); 
    my_addr.sin_addr.s_addr=INADDR_ANY; 

    if(bind(ds_sock,(struct sockaddr *)&my_addr,sizeof(my_addr))<0){ 
     printf("Error in bind"); 
    } 

    listen(ds_sock,2); 
    int ds_sock_acc; 
    struct sockaddr_in addr; 
    size_t sin_size = sizeof(struct sockaddr_in); 

    if((ds_sock_acc=accept(ds_sock,(struct sockaddr *)&addr,&sin_size))<1){ 
     printf("Error accept"); 
    } 
    printf("Connected\n"); 
    char *usr = DoLogin(ds_sock_acc); 
    printf("%s is connected\n",usr); 

    close(ds_sock_acc); 
    close(ds_sock); 

    return 0; 
} 

client.c

int main(){ 
    int ds_sock; 
    ds_sock = socket(AF_INET, SOCK_STREAM,0); 

    int ret; 
    struct sockaddr_in Eaddr; 
    Eaddr.sin_family = AF_INET; 
    Eaddr.sin_port = htons(25000); 
    Eaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); 
    ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr)); 
    if(ret==-1){ 
     printf("Error connect"); 
     perror("error:"); 
     exit(EXIT_FAILURE); 
    } 
    printf("Connect OK\n"); 
    char *usr = DoLogin(ds_sock); 
    printf("Logged in as %s\n",usr); 

    close(ds_sock); 
    return 0; 
} 
+0

你的錯誤檢查。你看到服務器端的錯誤信息嗎? – 2014-10-10 10:30:47

+4

他_應該在服務器端的'bind()'調用中看到一個錯誤。 – Alnitak 2014-10-10 10:31:08

+0

@alk不是嚴格意義上的重複的恕我直言,因爲OP不知道端口被綁定,而另一個問題是OP知道這一點,但不知道如何解決。 – Alnitak 2014-10-10 11:21:00

回答

3

的O/S通常可以防止偵聽套接字從相同的端口上被重建爲一個而以前的插座已經關閉之後,以防止最初發往原始套接字的消息被傳遞到新套接字。

要覆蓋此行爲,你需要setsockoptSO_REUSEADDR選項(服務器端):檢查省略錯誤]

int optval = 1; 
setsockopt(ds_sock, SO_REUSEADDR, &optval, sizeof(optval)); 

+0

我可以用一些SIGNALs解決這個問題嗎?此外,我一段時間沒有遇到這個問題,它剛剛發生在幾個小時前。昨天我測試了很多東西,一切都很好,多次嘗試。 – testermaster 2014-10-10 10:43:49

+0

信號不會影響套接字的行爲。 O/S之間涉及的正常超時允許重複使用同一端口而不抱怨應該少於4分鐘 – Alnitak 2014-10-10 11:00:36

+0

感謝您的答覆。 mm我剛剛下載了另一個程序,由其他人完成。我已經檢查了整個代碼,並沒有任何setsockopt,但是如果關閉服務器/客戶端並且在幾秒鐘內再次打開它,它可以正常工作。此外,我仍然不明白爲什麼昨天我沒有與我的代碼有這個問題。你有什麼主意嗎? – testermaster 2014-10-10 11:09:06