Ich habe meinen eigenen http-Server auf einem Raspberry Pi. Das Problem ist, wenn ich das Programm stoppe und neu starte, ist der Port nicht mehr verfügbar. Manchmal bekomme ich das gleiche Problem, wenn ich viele Anfragen erhalte.
Ich möchte SO_REUSEADDR verwenden, damit ich den Port auch dann weiter verwenden kann, wenn der Fehler auftritt, aber kein Glück hatte, dass er eingerichtet wurde. Unten ist mein Code.
Der Fehler, den ich bekomme, ist "FEHLER bei Bindung: Adresse bereits in Verwendung".Wie verwende ich Setsockopt (SO_REUSEADDR)?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
printf("Starting Listener\n");
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
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");
printf("about to listen\n");
listen(sockfd,5);
printf("finished listening\n");
clilen = sizeof(cli_addr);
printf("About to accept\n");
int i;
for(i=0; i<100; i++){
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");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
close(newsockfd);
}
close(sockfd);
return 0;
}
habe ich versucht, beide und bekam das gleiche Ergebnis nach dem Programm zu töten und es wieder nach oben zu starten. Dies ist der Fehler: Starting Listener Fehler bei der Bindung: Adresse bereits in Verwendung über zu hören fertig hören Über die Annahme – user3735849
Es funktioniert nicht richtig, wenn Sie das Programm auf die harte Tour töten. Sie müssen einen sauberen Ausgang durchführen. – Chnossos
Der Zweck von SO_REUSEADDR/SO_REUSEPORT besteht darin, die Wiederverwendung des Ports zuzulassen, auch wenn der Prozess abstürzt oder abgebrochen wurde. – mpromonet