2010-11-24 14 views
0

Je voudrais utiliser la fonction MS pour envoyer des données.WSASend: Envoyer int ou struct

Je n'ai pas trouvé d'exemples où ils envoient un autre type de données autre que const char *. J'ai essayé d'envoyer un int, ou autre, mais j'ai échoué. WSASend() et send() fonctionnent tous deux uniquement avec un paramètre Char *.

Comment dois-je procéder?

Merci

+0

Vous avez deux réponses précises et utiles à cette question, veuillez en accepter une. –

Répondre

1

est juste un pointeur vers un tampon, ce tampon peut contenir des tout ce que vous voulez. Ce pointeur char est en fait une adresse d'un tableau d'octets, cette fonction nécessite également un paramètre de longueur.

Un entier est un 2/4 (courte/longue) octets valeur,

Ensuite, si vous voulez envoyer une variable entière (par exemple), vous devez passer son adresse et sa longueur. WSASend et send sont des fonctions simples qui envoient un bloc de mémoire.

Je suppose que vous parlez de C, vous devez comprendre que les variables de C char sont des octets - bloc 8 bits, les variables char contiennent une valeur comprise entre 0 et 255.

Un pointeur sur char var est une adresse à un octet (qui peut-être la première cellule d'un tableau d'octets).

Je pense que c'est ce qui vous rend confus.

J'espère que vous comprenez.

+0

Je ne comprends pas vraiment, J'essaie ceci: int i = 0; send (client_socket, & i, sizeof (i)); cela ne fonctionne pas :( devrions-nous donner un exemple? merci – user377158

+2

int num = 4; send (client_socket, (char *) & num, sizeof (num), 0); – Hex

1

Le paramètre const char * indique que la fonction prend un pointeur sur octets. Sorcière semble vraiment être le résultat du fait que les concepteurs originaux d'api de socket soient pédantes - C a un type générique pour manipuler n'importe quel type de pointeur sans moulages explicites: void *.

Vous pourriez faire un emballage pratique pour envoyer comme celui-ci - qui vous permettra d'envoyer quelque chose (contiguë), vous pouvez faire un pointeur vers:

int MySend(SOCKET s, const void* buf, int len,int flags) 
{ 
    return send(s,(const char*)buf,len,flags); 
} 

Utiliser void * à la place de char * fait réellement l'api plus sûr, car il peut maintenant détecter quand vous faites quelque chose de stupide:

int x=0x1234; 
send(s,(const char*)x,sizeof(x),0); // looks right, but is wrong. 
mysend(s,x,sizeof(x),0); // this version correctly fails 
mysend(s,&x,sizeof(x),0); // correct - pass a pointer to the buffer to send. 

WSASend est un peu plus difficile à faire une Wapper de commodité pour que vous devez transmettre un tableau de struct contenant le char * » s - mais encore une fois c'est un cas de définir une structure équivalente avec const void * est à la place des const char *, puis lance les structures de données vers les types WSA dans le wrapper de commodité. Faites-le bien une fois, et le reste du programme devient beaucoup plus facile à déterminer correctement car vous n'avez pas besoin de jeter partout des bugs potentiels.

+0

Super! Mais, comment puis-je faire pour recevoir les données? J'ai essayé d'utiliser use recv(), il faut aussi un void * dans le paramètre, mais comment puis-je savoir si ce que je reçois est un int, char, ou autres? – user377158

+0

Que vous ne pouvez pas savoir. Les informations de type ne sont pas envoyées. Vous devez savoir ce que vous envoyez - en créant un protocole d'application - XML ​​ou quelque chose - afin de savoir comment analyser les données que vous recevez. –