我有一個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++。請舉個例子來說明你的解決方案。
你遇到的問題是兩個截然不同的問題。第一個是因爲你的代碼中有一個* buffer overflow *,第二個是因爲套接字處於'TIME-WAIT'狀態(參見[此TCP協議操作參考](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation)以查看狀態列表),並且您沒有在套接字上設置SO_REUSEADDR選項。 –