recv: Connection reset by peer
wenn ich in der Nähe mein client mit dem server bekomme ich diese Fehlermeldung aus dem server und der server fährt sich runter. Ich weiß, dass client kann die Verbindung zu beenden anmutig, aber ich bin der Planung zu senden diese aus, um einige Menschen und nicht will, dass mein server abgeschaltet werden, nur weil Sie nicht kündigen würde. So was könnte tatsächlich verhindern, dass die server geschlossen werden?
Ich bin mit sys/socket.h
Hier ist ein Teil von meinem code
int server() {
//Set up variables
int sockfd, new_fd; //Listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr; //My(server) address information
struct sockaddr_in their_addr; //Connector's address information
socklen_t sin_size;
//Generate the socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
//Generate the end point
my_addr.sin_family = AF_INET; //Host byte order
my_addr.sin_port = htons(MYPORT); //Short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; //Auto-fill with my IP
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
== -1) {
perror("bind");
exit(1);
}
//Start listnening
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
while(TERMINATE == 0) { //main accept() loop
sin_size = sizeof(struct sockaddr_in);
//Create a new connection for the accepted socket
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
&sin_size)) == -1) {
perror("accept");
continue;
}
//some semaphore stuff
}
return 0;
}
int main(int argc, char *argv[]){
//extra stuff
//Set up mutex locks
pthread_mutex_init(&mutex, NULL);
sem_init(&empty, 0, 30);
sem_init(&full, 0, 0);
//Set up and run Threads
pthread_t threads[30]; //Array of threads
pthread_t server_thread;
pthread_attr_t attr; //Set of thread attributes
//Get the default thread attributes
pthread_attr_init(&attr);
signal(SIGINT, termination);//Wait for a SIGINT
//Loop to create threads and execute consumer_thread
for (int i = 0; i < 30; i++) {
//Set up data in structure
threadArray[i].threadID = i;
threadArray[i].running = 0;
threadArray[i].line_counter_pointer = &line_counter;
threadArray[i].vid_details_pointer = &vid_details;
pthread_create(&threads[i],&attr,consumer_thread, &threadArray[i]);
}
//Execute the producer_thread
pthread_create(&server_thread,&attr,producer_thread, NULL);
//Wait for all the threads to exit
for (int i = 0; i < 30; i++) {
pthread_join(threads[i],NULL);
}
//Destroy semaphores so that it can TERMINATE gracefully
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
void *producer_thread(void *param) {
server();//Runs the server() function
return NULL;
}
void *consumer_thread(void *param) {
//Pass variable
struct thread_params *threadStruct;
threadStruct = (struct thread_params *) param;
int *line_counter = threadStruct->line_counter_pointer;
vid_details_struct *vid_details = threadStruct->vid_details_pointer;
//End of pass
char found_result [MAXDATASIZE];
int queue_item = 0;
int numbytes;
struct timeval item_wait_time;//Get the current time
while (TERMINATE == 0) { //Main accept() loop
int new_fd;
//Use a variable that would be set to 0 after the client termination
//so that the current connection will be closed on both thread and
//client, that would make thread to go back to idle
int current_connection = 1;
//Acquire full semaphore
sem_wait(&full);
//Acquire mutex lock to protect buffer
pthread_mutex_lock(&mutex);
//some extra stuff including socket information
//now handling queue[queue_item]
new_fd = queue[queue_item].new_fd;
queue[queue_item].waiting = 0;
//Release mutex lock and empty semaphore
pthread_mutex_unlock(&mutex);
sem_post(&empty);
while (current_connection == 1) {
char buf[MAXDATASIZE];
//Receive the query
if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';//Set the end point of the string
if (!strcmp(buf,"q")) {//Client prompts to TERMINATE
current_connection = 0;//Flag the connection as closed
}
if (current_connection == 1) {//If still connected
//do something
if (send(new_fd, found_result, MAXDATASIZE, 0) == -1) {
perror("send");
close(new_fd);
exit(0);
}
}
}
close(new_fd); //Close the socket connection
//Wait for half a second before accepting a new request
usleep(500000);
}//End of the main while loop
FINISHEDSEMS++;
printf("Thread %d is closing\n", threadStruct->threadID);
return NULL;
}
du bist wahrscheinlich gehen zu wollen, um post-zumindest einige-code, um uns zu zeigen, wo Sie sind, ab. Sind Sie mit Vanille TCP-sockets oder einer beliebigen Bibliothek (vorausgesetzt, ehemalige, basierend auf tags, sondern würde eher explicit)
Ich enthalten Sie jetzt
Danke... bin ich etwas fehlt, oder kannst du nicht nur nicht beenden, wenn recv oder send return -1?
Ich enthalten Sie jetzt
Danke... bin ich etwas fehlt, oder kannst du nicht nur nicht beenden, wenn recv oder send return -1?
InformationsquelleAutor Sarp Kaya | 2012-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser wenn-Anweisung ist das, was Sie brauchen, zu betrachten:
Es ist der einzige Ort, den Sie geschrieben hat, dass
recv
, das ist also der Fehler.Werfen Sie einen Blick auf die Mann Seite:
recv
gibt die Länge der Nachricht über den erfolgreichen Abschluss. Wenn eine Meldung zu lang und passt nicht in den bereitgestellten Puffer, überschüssige bytes verworfen werden kann, abhängig von der Art der socket die Nachricht empfangen wird, aus. Wenn keine Nachrichten vorhanden sind an der Buchse, die Anrufe empfangen warten auf eintreffen einer Nachricht, es sei denn, der socket ist nicht blockierende (siehe fcntl(2)), in welchem Fall der Wert -1 zurückgegeben und die externe variable errnoAlso anstatt einen Anruf zu
exit
(der der Prozess beendet wird), versuchen, die Handhabung der Fehler, die anmutig:NEIN! der sockel ist die Verbindung zwischen Ihrem computer und dem internet, schließen Sie den socket schließen würde jede offene Verbindung auf diesen port, und würde im wesentlichen fahren die server runter. Sie nur schließen Sie die Verbindung, und lassen Sie die Buchse.
ja, du wirst anrufen möchten
close
aufnew_fd
JA! und Schmarrn. Schließen Sie den socket schließt den socket. Es nicht schließen Sie alle anderen Steckdosen; es ist nicht 'schließen jeden anderen Zusammenhang' nicht 'halt die server down'. Er sollte in der Nähe der sockel, auf dem der Fehler aufgetreten ist, es sei denn, es war nur ein timeout-Fehler, in dem Fall sollte er wiederholen, so oft er dies für notwendig hält. Wenn Sie sprechen über die hören Steckdose, die ist auch nicht ersichtlich aus deinem Kommentar, es tut Herunterfahren der server down, aber es hat keinen Einfluss auf bestehende verbindungen.
gute Klarstellung. und ja, ich meinte den socket. Ich dachte, es war offensichtlich von den OP ' s post und get Kommentare, wenn er sagt: "sockel", meint er
sockfd = socket(...)
in seinem code, das ist in der Tat der listening-socket, und sollte nicht geschlossen werden. Und du hast Recht, es würde sich nicht auf vorhandene verbindungen, es sei denn der code, schließt die socket-Ausgänge die main-Prozess (das würde zu beenden alle threads und verbindungen)InformationsquelleAutor cegfault
'Connection reset by peer" hat verschiedene Ursachen, aber die häufigste ist, dass Sie geschrieben haben, zu einer Verbindung, die bereits geschlossen worden, durch den peer. In anderen Worten, eine Anwendung Protokoll-Fehler.
InformationsquelleAutor user207421