[c] [linux] [socket] prawidłowe zakymanie socketa
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

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

AutorWiadomość
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
» 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
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
» 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
« 1 »
 Strona 1 z 1