2010-11-13 4 views
4

J'essaie de créer un programme (client) qui peut envoyer un message à un serveur à la demande de l'utilisateur. Code Dépouillée suit:Envoi de plusieurs messages via send() recv(), Programmation socket, C

Client:

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

    struct sockaddr_in servaddr; 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(6789); 
    servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>); 

    while(1) { 

    char message[161]; 
    fgets(message, 161, stdin); 

    /* Replacing '\n' with '\0' */ 
    char *tmp = strchr(message, '\n'); 
    if (tmp) *tmp = '\0'; 

    connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
    send(sock, message, strlen(message), 0); 
    close(sock); 
    } 
} 

Serveur:

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

    struct sockaddr_in servaddr; 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(6789); 

    bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
    listen(sock, 5); 

    while(1) { 
    int clisock = accept(sock, (struct sockaddr *) NULL, NULL); 

    if (clisock >= 0) { 
     int messageLength = 160; 
     char message[messageLength+1]; 
     int in, index = 0, limit = messageLength; 

     while ((in = recv(clisock, &message[index], messageLength, 0)) > 0) { 
     index += in; 
     limit -= in; 
     } 

     printf("%s\n", message); 
    } 

    close(clisock); 
    } 
} 

Maintenant, cela fonctionne pour le premier message que j'envoie. Mais alors il n'est pas capable de faire une autre connexion (j'obtiens le message d'erreur "Descripteur de fichier incorrect" en essayant de se connecter dans le programme Client.) Quelqu'un peut-il voir ce que j'ai mal compris? Merci :)

+0

L'appel accepté ou l'appel recv retournera une erreur. Vérifiez pour cela et la cause deviendra plus claire. perror() est très pratique pour ça. (Note: close renvoie probablement une erreur ici si accept renvoie une erreur et c'est une bonne habitude de vérifier la liaison et d'écouter les valeurs de retour aussi.) – Flexo

+0

Je reçois une erreur en appelant connect() dans le client, et un message d'erreur "Descripteur de fichier incorrect" – ragnaroh

+1

Gardez à l'esprit que TCP est un flux. Il n'a pas de messages. Vous recevez 160 octets, ce qui peut être plusieurs messages d'application que le client a envoyés. – nos

Répondre

1

votre programme client fait également la même erreur, la première fois que vous ouvrez le socket, mais après la première connexion, vous fermez le socket, donc la prochaine fois dans la boucle, le descripteur de socket n'est pas valide. ouvrir le socket mais cela manque, s'il vous plaît supprimer l'appel de socket de haut et ajouter la ligne ci-dessous dans le début de while boucle

int sock = socket (AF_INET, SOCK_STREAM, 0);

+0

Ahh ... merci! Cela fonctionne magnifiquement maintenant :) – ragnaroh

2

Le problème est que vous fermez la prise d'écoute sock, au lieu de la prise client clisock.

+0

Merci pour votre réponse. J'ai corrigé l'erreur. Cependant, cela ne fonctionne toujours pas. Il ne fonctionne plus dans une boucle infinie, mais il ne semble toujours pas pouvoir se connecter. J'ai vérifié toutes les valeurs de retour de socket, bind, listen, etc. Il semble que j'obtiens une erreur quand j'appelle connect() dans le client, et un message d'erreur "Bad descriptor". – ragnaroh

2
servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>); 

au lieu des lignes ci-dessus dans votre code client utilise le

inet_pton(AF_INET,"<ipofserver>",&servaddr.sin_addr); 

suivant effectuer un contrôle d'erreur pour la fonction fllowing également.

Questions connexes