Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c] [linux] [socket] prawidłowe zakymanie socketa

Ostatnio zmodyfikowano 2017-12-19 09:47
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
[c] [linux] [socket] prawidłowe zakymanie socketa
» 2017-12-06 10:04:12
witam, piszę aplikację, która używa socketa, mam problem jak poprawnie zamknąć socket, ponieważ gdy zamknę program i uruchomię go szybko od razu to dostanę taki błąd :

ERROR on binding: Address already in use

to kod początku programu :
C/C++
int portno;
socklen_t clilen;
char buffer[ 256 ];
struct sockaddr_in serv_addr, cli_addr;
int n, pid;
sockfd = socket( AF_INET, SOCK_STREAM, 0 );
printf( "sockfd %d\n", sockfd );
if( sockfd < 0 ) {
    perror( "ERROR opening socket" );
    exit( 1 );
}

bzero(( char * ) & serv_addr, sizeof( serv_addr ) );
portno = 5001;
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 ) {
    perror( "ERROR on binding" );
    exit( 1 );
}


int newsockfd;
listen( sockfd, 5 );
clilen = sizeof( cli_addr );
while( 1 ) {
    newsockfd = accept( sockfd,( struct sockaddr * ) & cli_addr, & clilen );
    //tu główna część aplikacji
}


a socket zamykam tak( próbowałem obu funkcji) :
C/C++
void sigint( int a ) { //ctrl + c
   
   
    close( sockfd );
    //shutdown(sockfd,2);
    exit( 1 );
}


po dłuższej chwili nie ma problemu i aplikacja daje się normalnie uruchomić, czytałem na necie, że socket jest przez chwilę zajęty nawet po zamknięciu aplikacji, pozdro
P-167624
darko202
» 2017-12-06 12:52:51
1
nie widać z jakiej biblioteki korzystasz
2
spróbuj closesocket(...)

C/C++
ConnectSocket = socket( ptr->ai_family, ptr->ai_socktype,
ptr->ai_protocol );
...

// cleanup
closesocket( ConnectSocket );
WSACleanup();
z
https://msdn.microsoft.com​/en-us/library/windows/desktop​/ms737591(v=vs.85).aspx

3.
C/C++
while( 1 )
{
    newsockfd = accept( sockfd,
    ( struct sockaddr * ) & cli_addr, & clilen );
    if( newsockfd < 0 )
         error( "ERROR on accept" );
   
    pid = fork();
    if( pid < 0 )
         error( "ERROR on fork" );
   
    if( pid == 0 )
    {
        close( sockfd ); ///1.
        dostuff( newsockfd ); ///2.
        exit( 0 ); ///3 koniec programu
    }
    else
         close( newsockfd );
   
} /* end of while */
z
http://www.linuxhowtos.org​/C_C++/socket.htm


4.
z
http://www.bogotobogo.com​/cplusplus​/sockets_server_client.php
C/C++
//serwer
close( newsockfd );
close( sockfd );

//client
close( sockfd );

5.
ewentualnie poszukaj w innych linkach np.
https://www.bing.com/search​?q=c%2B%2B+socket+example​&src=IE-SearchBox&FORM=IENTSR

P-167626
aaadam
Temat założony przez niniejszego użytkownika
» 2017-12-06 13:26:58
to są moje wszystkie headery :

C/C++
#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
#include "RF24.h"

czyli chyba standardowa biblioteka linuxa
P-167627
darko202
» 2017-12-06 13:34:48
na
http://cpp0x.pl/kursy​/Kurs-WinSock-C++​/Tlo-Klient-Serwer/276

C/C++
#include <sys/socket.h>
....
int sockfd, new_fd; // nasłuchuj na sock_fd, nowe połaczenia na new_fd
....
if( !fork() ) { // to jest proces-dziecko
    close( sockfd ); // dziecko nie potrzebuje gniazda nasłuchującego
    if( send( new_fd, "Hello, world!\n", 14, 0 ) == - 1 )
         perror( "send" );
   
    close( new_fd );
    exit( 0 );
}
close( new_fd ); // rodzic nie potrzebuje tego

czyli tak jak napisałem w 4. jest różnica na serwerze i kliencie
P-167629
Kalarepka
lol
» 2017-12-18 13:30:32
Jak mam rozmawiać z ludźmi którzy zaprzeczają prostej logice, nie w bezpośredni sposób, jedynie przedstawiają swoje "ja" i brną w jakieś swoje fantazje o matematyce które tyle wnoszą do tematu co nic? Wpadają w błędne koła swoich teorii, i wałkują to samo do znudzenia. Po prostu irytuje mnie coś takiego, i miałby tak każdy inteligentny człowiek, to naturalne. To że piszę prawdę o czyimś zachowaniu, nie jest obrażaniem, obrażanie to mówienie nieprawdy o kimś. Jeśli nie jesteście w stanie logicznie podbić moich argumentów, tylko doświadczam tutaj bezsensownego lania wody, to jak się nie poirytować, nawet nie odnosicie się do moich argumentów z sensem, z jakim je przedstawiłem, za wszelką cenę próbujecie zaprzeczyć, ale nie wiecie jak, wpadacie w błąd logiczny typu, a jest częścią b, a jest założeniem bez którego nie ma b, wtedy z b nie może wynikać a, u was może :D. Jeden nawet zaprzecza swoim słowom, pisze tak jak mu akurat pasuje i jaki jest trend w tej dyskusji, a trend jest taki że za wszelką cenę chcecie pokazać że się mylę.
P-167977
mateczek
» 2017-12-18 19:45:10
komuś się fora pomyliły ??
P-167978
aaadam
Temat założony przez niniejszego użytkownika
» 2017-12-19 09:47:35
nie wiem dlaczego 'close' socket zaczęło działać, zamykam
P-167987
« 1 »
  Strona 1 z 1