2010-01-27 71 views
3

我學習在C socket編程,我寫了這個簡單的程序來接受我使用telnet連接到它的端口5072連接。這工作正常,第一次,但是當我嘗試再次運行它立即失敗顯示BIND:已使用的地址,但隨後又開始一分鐘左右後,開始工作。我在做什麼wromg?綁定錯誤:地址已在使用

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 


int main(){ 

//variables 

int listenfd, clientfd; 
socklen_t clilen; 
struct sockaddr_in cliaddr,servaddr; 

//getsocket 
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ 
perror("SOCKET"); 
exit(0); 
} 


//prep the servaddr 
bzero(&servaddr,sizeof servaddr); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1"); 
servaddr.sin_port = htons(5072); 


//bind 
if(bind(listenfd, (struct sockaddr *) &servaddr,sizeof servaddr)<0){ 
perror("BIND"); 
exit(0); 
} 



//listen 
if(listen(listenfd,20)<0){ 
perror("LISTEN"); 
exit(0); 

} 


//accept 
int counter = 1; 
clilen = sizeof cliaddr; 
while(counter<3){ 

clientfd = accept(listenfd,(struct sockaddr *) &cliaddr,&clilen); 
if(clientfd == -1){ 
perror("ACCEPT"); 
exit(0); 
} 
if(fork()==0){ 
close(listenfd); 
printf("CONNECTION NO. %d\n",counter); 
close(clientfd); 
exit(0); 
} 
counter++; 
close(clientfd); 
} 
close(listenfd); 
} 

感謝

+0

請張貼*最小*的代碼顯示問題。 – 2010-01-27 14:33:33

+0

對不起,我不知道是否有綁定呼叫或子進程結構的錯誤,所以我貼了整個事情。但將來會保重。 – abhishek 2010-01-27 14:54:56

回答

8

您必須setsockopt(SO_REUSEADDR)

用於解釋爲什麼見this faq

-2

或者乾脆等待幾分鐘。在關閉後,TCP/IP堆棧保持在套接字上的最大段生存時間的兩倍,以防止第一個連接發生的任何雜散包在第二個連接建立後出現,這將使其全部混淆。

+1

這個答案真的有用嗎?他在問自己做錯了什麼 - 除此之外,abhishek已經提到等待一分鐘解決問題...... – Kimvais 2010-01-28 08:05:35

相關問題