2016-01-22 67 views
2

我有一個C++應用程序接收1個字符並運行一個函數,取決於它收到的字符。問題是應用程序一收到一條消息就會停止。循環TCP通信C++

我需要應用程序在收到消息後再次開始在相同的端口上偵聽,但我沒有設法這樣做。我試着用「while(true)」循環來循環它,但是我得到錯誤。

這也可能是值得注意的是,後服務器已經成功地運行它給出了消息:砸檢測

** *堆***:終止

中止(核心轉儲)

如果我嘗試在同一端口上再次運行該服務器後,它已經成功地完成了,我得到:

錯誤的綁定:地址已在使用

重大代碼:

int main(int argc, char *argv[]) { 
int sockfd, newsockfd, portno; 
socklen_t clilen; 
char buffer[1]; 
struct sockaddr_in serv_addr, cli_addr; 
int n; 
if (argc < 2) { 
fprintf(stderr,"ERROR, no port provided\n"); 
exit(1); 
} 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) 
error("ERROR opening socket"); 
bzero((char *) &serv_addr, sizeof(serv_addr)); 
portno = atoi(argv[1]); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(portno); 
if (bind(sockfd, (struct sockaddr *) &serv_addr, 
     sizeof(serv_addr)) < 0) 
     error("ERROR on binding"); 
listen(sockfd,5); 
clilen = sizeof(cli_addr); 
newsockfd = accept(sockfd, 
     (struct sockaddr *) &cli_addr, 
     &clilen); 
if (newsockfd < 0) 
    error("ERROR on accept"); 
bzero(buffer,256); 
n = read(newsockfd,buffer,255); 
if (n < 0) error("ERROR reading from socket"); 
if (buffer[0] == '0') { 
    lamp(); 
} 
else { 
    printf("No valid input from client.\n"); 
} 
if (n < 0) error("ERROR writing to socket"); 
close(newsockfd); 
close(sockfd); 
return 0; 

}

編輯:我應該提到,我很新的C++。請舉個例子來說明你的解決方案。

+0

你遇到的問題是兩個截然不同的問題。第一個是因爲你的代碼中有一個* buffer overflow *,第二個是因爲套接字處於'TIME-WAIT'狀態(參見[此TCP協議操作參考](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation)以查看狀態列表),並且您沒有在套接字上設置SO_REUSEADDR選項。 –

回答

2

char buffer[1]; ... bzero(buffer,256);

當然,你已經破壞了整個堆棧後,是可以理解的其他合理的代碼是突然失敗。

+0

我是C++新手。你能告訴我如何解決它嗎? – Jancoz

+0

@Jancoz:代碼是舊的C,不是現代的C++。最小的修正是'char buffer = 0;'。放下'bzero',這太過分了。另外,'讀'一個字符而不是255。 – MSalters