J'essaie d'envoyer une chaîne à une application serveur en utilisant C, mais j'ai rencontré un problème. Je suis relativement nouveau dans la programmation réseau, et je pense que mon code aboie dans le mauvais arbre.Envoi de la longueur du tampon et de la mémoire tampon sur la socket dans c
Le message est censé être la longueur du message + message et est décompressé de l'autre côté par un serveur python en tant que tel (BUF étant les données entrantes brutes):
msg_len_bytes = buf[0:4]
msg_len = struct.unpack("!L", msg_len_bytes)[0]
! signifie l'ordre des octets du réseau et L signifie non signé long.
Il est assez simple d'envoyer une chaîne régulière. envoyer (chaussette, message, strlen (message), 0);
Mais en ajoutant la longueur du message, je n'arrive pas à comprendre. Voici le code pour mon client jusqu'à présent:
struct msgstruct {
uint32_t length;
char send_data[4096];
};
int main()
{
int sock;
struct msgstruct message;
char data[4096] = "<MOP><test/></MOP>";
for (int i = 0; i < strlen(data); i++) {
message.send_data[i] = data[1];
}
struct hostent *host;
struct sockaddr_in server_addr;
unsigned long buflen = sizeof(message.send_data);
uint32_t bufsend = htonl(buflen);
message.length = bufsend;
host = gethostbyname("127.0.0.1");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12998);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1) {
perror("Connect");
exit(1);
}
if(send(sock, message.length + message.send_data, sizeof(message), 0) == -1){
printf("\nSocket error.");
exit(1);
}
return 0;
}
J'ai essayé quelques variations, mais je finis toujours avec une erreur de socket. Est-ce parce que je mélange des types dans le second argument pour envoyer? Je reçois des erreurs de compilation si j'essaye d'envoyer la structure.
Si vous êtes satisfait des réponses fournies, s'il vous plaît choisir un (moi je l'espère!) Comme « réponse correcte » avec la coche. Cela vaut 15 rep. pointe vers moi, et rend la question plus utile dans les futures références. – abelenky