Błąd - Error accepting 24

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Błąd - Error accepting 24

Post autor: NetTomassPL »

Witam,
Mam komunikacje server-client w C++ i wszystko ładnie działa, aż po pewnym czasie używania przy próbie wysłania informacji wyskakuje komunikat w terminal'u "Error accepting 24".
Więc czy wiecie może jak temu zaradzić?
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

poprawić błąd w programie?
bo bez pokazania kodu lepszej odpowiedzi się nie spodziewaj.

-- 20 lip 2013 16:43 --

poprawić błąd w programie?
bo bez pokazania kodu lepszej odpowiedzi się nie spodziewaj.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Re: Błąd - Error accepting 24

Post autor: NetTomassPL »

Server

Kod: Zaznacz cały

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

void* SocketHandler(void*);

int main(int argv, char** argc){

system("fuser -k 1101/tcp");
int host_port= 1101;

struct sockaddr_in my_addr;

int hsock;
int * p_int ;
int err;

socklen_t addr_size = 0;
int* csock;
sockaddr_in sadr;
pthread_t thread_id=0;


hsock = socket(AF_INET, SOCK_STREAM, 0);
if(hsock == -1){
printf("Error initializing socket %d\n", errno);
goto FINISH;
}

p_int = (int*)malloc(sizeof(int));
*p_int = 1;

if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
(setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
printf("Error setting options %d\n", errno);
free(p_int);
goto FINISH;
}
free(p_int);

my_addr.sin_family = AF_INET ;
my_addr.sin_port = htons(host_port);

memset(&(my_addr.sin_zero), 0, 8);
my_addr.sin_addr.s_addr = INADDR_ANY ;

if( bind( hsock, (sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d\n",errno);
goto FINISH;
}
if(listen( hsock, 10) == -1 ){
fprintf(stderr, "Error listening %d\n",errno);
goto FINISH;
}

//Now lets do the server stuff

addr_size = sizeof(sockaddr_in);

while(true){
printf("waiting for a connection\n");
csock = (int*)malloc(sizeof(int));
if((*csock = accept( hsock, (sockaddr*)&sadr, &addr_size))!= -1){
printf("---------------------\nReceived connection from %s\n",inet_ntoa(sadr.sin_addr));
pthread_create(&thread_id,0,&SocketHandler, (void*)csock );
pthread_detach(thread_id);
}
else{
fprintf(stderr, "Error accepting %d\n", errno);
}
}

FINISH:
;
}

void* SocketHandler(void* lp){
    int *csock = (int*)lp;

char buffer[1024];
int buffer_len = 1024;
int bytecount;

memset(buffer, 0, buffer_len);
if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %d\n", errno);
goto FINISH;
}
printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
strcat(buffer, " SERVER ECHO");

if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){
fprintf(stderr, "Error sending data %d\n", errno);
goto FINISH;
}

printf("Sent bytes %d\n", bytecount);


FINISH:
free(csock);
    return 0;
}
Client

Kod: Zaznacz cały

#include <iostream>
#include <cstdio>
#include <fstream>
#include <sstream>

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

using namespace std;

void wysylanie(string komenda);

int main(int argv, char** argc)
{
	string komenda="test";
	
	while(true)
	{
		usleep(10*1000);
    if(komenda!="0")
    {
       wysylanie(komenda);
    }
	}
	
return 0;
}

void wysylanie(string komenda)
{
    string FileMeasure=komenda+" ";
    int TempNumOne=FileMeasure.size();
    char Filename[100];
    for (int a=0;a<=TempNumOne;a++)
    {
        Filename[a]=FileMeasure[a];
    }

    ifstream configStrumien("config.txt");
    if(configStrumien)
    {
        //cout << "Plik został odczytany!" << endl;
    }
    else
    {
        cout << "BŁĄD: nie można otworzyć pliku konfiguracji do odczytu." << endl;
        cout<<"Naciśnij ENTER aby wyjść!"<<endl;
        cin.get();
        exit(1);
    }

    int port;
    string name;
    string linia;

    getline(configStrumien, linia);
    //cout<< linia << endl;
    istringstream iss(linia);
    iss >> port;

    getline(configStrumien, linia);
    //cout<< linia << endl;
    name = linia;

    int host_port= port;
    const char* host_name=name.c_str();

    struct sockaddr_in my_addr;

    char buffer[1024];
    int bytecount;
    int buffer_len=0;

    int hsock;
    int * p_int;
    int err;

    hsock = socket(AF_INET, SOCK_STREAM, 0);
    if(hsock == -1){
        printf("Error initializing socket %d\n",errno);
        goto FINISH;
    }

    p_int = (int*)malloc(sizeof(int));
    *p_int = 1;

    if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
        (setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
        printf("Error setting options %d\n",errno);
        free(p_int);
        goto FINISH;
    }
    free(p_int);

    my_addr.sin_family = AF_INET ;
    my_addr.sin_port = htons(host_port);

    memset(&(my_addr.sin_zero), 0, 8);
    my_addr.sin_addr.s_addr = inet_addr(host_name);

    if( connect( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1 ){
        if((err = errno) != EINPROGRESS){
            fprintf(stderr, "Error connecting socket %d\n", errno);
            goto FINISH;
        }
    }

    //Now lets do the client related stuff

    buffer_len = 1024;

    memset(buffer, '\0', buffer_len);

    //printf("Enter some text to send to the server (press enter)\n");
    //fgets(buffer, 1024, stdin);
    Filename[strlen(Filename)-1]='\0';

    if( (bytecount=send(hsock, Filename, strlen(Filename),0))== -1){
        fprintf(stderr, "Error sending data %d\n", errno);
        goto FINISH;
    }
    //printf("Sent bytes %d\n", bytecount);

    if((bytecount = recv(hsock, Filename, buffer_len, 0))== -1){
        fprintf(stderr, "Error receiving data %d\n", errno);
        goto FINISH;
    }
    //printf("Recieved bytes %d\nReceived string \"%s\"\n", bytecount, Filename);
cout<<komenda<<endl;



    close(hsock);


FINISH:
;
}
Oryginał - https://github.com/iri/ercshell/tree/ma ... /LinSocket
Ostatnio zmieniony 25 sie 2013, 20:13 przez NetTomassPL, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

ech... leniwy jestem.
możesz tak po drodze wyjaśnić dlaczego uparłeś się na wypisywanie numeru błędu zamiast opisu?
man perror (albo strerror albo coś podobnego), zastosuj, odpal i wrzuć komunikat.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Re: Błąd - Error accepting 24

Post autor: NetTomassPL »

?
W terminu pisze tylko Error accepting 24
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

Coś Ci napisałem.
To jest dział "programowanie" a nie "zróbcie za mnie bo ja nie wim i nie ómi a mie siem nie kce".
Wróć do poprzedniego posta, poczytaj, zrób, podaj wynik.
Jeśli nie - sorry, ale chyba pomyliłeś fora.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Re: Błąd - Error accepting 24

Post autor: NetTomassPL »

Wstawiłem:

Kod: Zaznacz cały

printf ("Label: %s\n",strerror(errno));
Otrzymałem:

Kod: Zaznacz cały

Label: Too many open files
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

To teraz znajdź w swoim kodzie miejsce, gdzie zamykasz socket uzyskany z accept...
O, nie ma?
No to już wszystko jasne.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Re: Błąd - Error accepting 24

Post autor: NetTomassPL »

Więc czy mógłby mi ktoś napisać w jaki sposób mam tego dokonać?
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

w skrócie:

Kod: Zaznacz cały

int s=accept(cośtam);
// tu robisz coś z s
close(s);
już wiesz?
jak nie to poszukaj sobie wywołania free i przyjrzyj się dokładnie linijce której tam nie ma.
NetTomassPL
Sędziwy Jeż
Sędziwy Jeż
Posty: 30
Rejestracja: 08 cze 2013, 09:39
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Architektura: x86

Re: Błąd - Error accepting 24

Post autor: NetTomassPL »

Kolega mi powiedział że na końcu server.cpp zrobić:

Kod: Zaznacz cały

shutdown( *csock , 2 ); 
close( *csock ); 
free( csock );
I działa, problem rozwiązany.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Błąd - Error accepting 24

Post autor: ethanak »

a sam na to nie wpadłeś?
mam tylko nadzieję że jako programista zatrudnisz się u konkurencji.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości