2010-08-18 4 views
1

J'ai des problèmes pour créer un port sous Unix. Ce code renvoie toujours "Erreur lors de la création du socket (3)", ce qui n'a aucun sens puisque sockfd doit être plus petit que 0 pour imprimer la ligne d'erreur.Problèmes de création et de liaison de port sous Unix. (Nouveau dans la programmation réseau)

server.c:

int main (int argc, char **argv) 
{ 
    int sockfd; 
    struct sockaddr_in server_sockaddr; 
    char buff[TRANSFER_BUFFER_LEN]; 

    /* check number of command line arguments */ 
    if (argc < 2) 
    { 
    fprintf (stderr, "Usage: %s <port>\n"); 
    exit (EXIT_FAILURE); 
    } 

    /* create server socket */ 
    if ((sockfd = createUdpSocket (&sockfd, 
           &server_sockaddr, 
           atoi (*(argv + 1))) 
    ) < 0); 
    { 
    fprintf (stderr, "Error creating socket (%d).\n", sockfd); 
    exit (EXIT_FAILURE); 
    } 

    ... 

return 0; 
} 

socket_utils.h:

int createUdpSocket (int *sockfd, struct sockaddr_in *client_sockaddr, int port) 
{ 
    /* create socket */ 
    if ((*sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) 
    return -1; 

    memset (client_sockaddr, 0, sizeof (struct sockaddr_in)); 
    client_sockaddr->sin_family = AF_INET; 
    client_sockaddr->sin_addr.s_addr = htonl (INADDR_ANY); 
    client_sockaddr->sin_port = htons (port); 

    /* bind socket */ 
    if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd))) 
    { 
    close (*sockfd); 
    return -2; 
    } 

    return *sockfd; 
} 

Toutes les idées? Cette même fonction fonctionne très bien dans mon programme client qui ne prend pas de valeur de port (prend à la place 0).

Cheers,

Rhys

+0

Quel port # essayez-vous d'ouvrir? Les ports <= 1024 nécessitent des privilèges. –

Répondre

6
if ((sockfd = createUdpSocket (&sockfd, 
           &server_sockaddr, 
           atoi (*(argv + 1))) 
    ) < 0); 

Whoops, qui viennent Où as point-virgule à partir? Vous avez un passager clandestin!


En outre, cette ligne ne fera pas ce que vous attendez:

if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd))) 

La fonction retourne bind() 0 en cas de succès, -1 en cas d'échec. Votre test est rétrograde et l'erreur se produit lorsque la liaison réussit plutôt que d'échouer. Il a également un & incorrect où vous dites &client_sockaddr. Et le troisième argument doit être la taille de la struct sockaddr_in, pas sizeof(sockfd). Essayez:

if (bind (*sockfd, (struct sockaddr*) client_sockaddr, sizeof (struct sockaddr_in)) != 0) 

Et diable pendant que nous sommes ici, votre impression d'utilisation manque son argument argv[0]:

fprintf (stderr, "Usage: %s <port>\n"); 
+0

Oh la honte! Merci beaucoup. –

0

On dirait que vous avez trop de parenthèses qui est source de confusion le code et vous-même .... Aussi, voici un utile guide pour comprendre la programmation réseau avec des douilles gracieuseté de beej ...

+0

Bravo, ça a l'air bien. –