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 :)
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
Je reçois une erreur en appelant connect() dans le client, et un message d'erreur "Descripteur de fichier incorrect" – ragnaroh
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