Wie verwende ich Setsockopt (SO_REUSEADDR)?
Ich bin mit meinem eigenen http-server auf einem raspberry pi. Das problem ist, wenn ich das Programm stoppen und neu starten, der port ist nicht mehr verfügbar. Manchmal habe ich das gleiche Problem beim empfangen eine Vielzahl von Anforderungen.
Ich will SO_REUSEADDR, so dass ich mithalten kann mit dem-Anschluss, selbst wenn der Fehler Auftritt, aber kein Glück hatten, bekommen es einrichten. Unten ist mein code.
Den Fehler bekomme ich "ERROR on binding:Address already in use".
#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;
}
InformationsquelleAutor der Frage user3735849 | 2014-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach :
Können Sie hinzufügen (mit standard C99 Verbindung litteral-Unterstützung) :
Oder :
InformationsquelleAutor der Antwort Chnossos
Abhängig von der libc release könnte es erforderlich sein, um sowohl SO_REUSEADDR und SO_REUSEPORT socket-Optionen, wie in socket(7) Dokumentation :
Da diese socket-option wird mit kernel 3.9 und Himbeere verwenden, 3.12.x, es wird benötigt, um die SO_REUSEPORT.
Können Sie festlegen, Thesen zwei Optionen vor dem Aufruf von bind, wie diese :
InformationsquelleAutor der Antwort mpromonet