Programmation Windows Socket en C

Je prends un cours de réseautage où le professeur lit littéralement le livre à la classe. Inutile de dire que je n’ai aucune idée de ce que je fais. Notre projet de semestre consiste à copier du code de notre manuel et à créer un réseau client-serveur. Copier littéralement le code du livre sans aucune modification.

Le livre comportait des erreurs dans le code (point virgule manquant, paranthesis supplémentaire) mais j’ai réussi à comstackr au moins le code. Cependant, je rencontre un tas d’erreurs de lien.

Exemple: Erreur 1 Erreur LNK2019: symbole externe non résolu

J’ai cherché le code d’erreur et je pense que le code tente de créer un lien vers des définitions qui n’existent pas dans les fichiers d’en-tête. J’ai du mal à corriger les erreurs LNK vs les erreurs de syntaxe. Mais comme je l’ai dit, je n’ai aucune idée de la façon de régler ce problème. J’envoie le code du côté serveur, j’ai rencontré les mêmes erreurs du côté client.

include  include  include  include  include  include  int main(void) { int s; int len; char buffer[256]; struct sockaddr_in servAddr; struct sockaddr_in clntAddr; int clntAddrLen; //length of client socket addre //Build local (server) socket add memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_port = htons(21); servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //create socket if((s=socket(PF_INET, SOCK_DGRAM, 0) <0 )) { perror("Error: Socket Failed!"); exit(1); } //bind socket to local address and port if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr))<0)) { perror("Error:bind failed!"); exit(1); } for(;;) { len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen); //send string sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr)); } } 

Tous les conseils, liens vers des informations utiles ou des conseils seraient appréciés. J’ai essayé de lire le manuel mais je suis complètement perdu. En outre, c’est la seule affectation liée au code que nous avons effectuée tout au long du semestre. Tout le rest a collecté des paquets en utilisant un renifleur de paquets. Littéralement entré en classe et dit copie et exécuter le code à la page X.

Vous devez lier la bibliothèque Ws2_32.lib pour utiliser winsock. Vous devez également appeler WSAStartup avant d’utiliser d’autres fonctions de winsock (cela ne cause pas votre erreur actuelle, mais vous posera des problèmes une fois le problème de bibliothèque manquant résolu).

Au début, je vais essayer d’aider à utiliser votre dernier commentaire: Supposons que vous utilisez Visual Studio (je pense que c’est la meilleure option pour démarrer winsock pour la programmation Windows car Microsoft se soucie de la mise à jour des bibliothèques Windows et de leur compatibilité support msdn).

Si vous obtenez une erreur telle que celle-ci: 1> asdf.obj: error LNK2001: symbole externe non résolu _ impp _WSAStartup @ 8 signifie que ws2_32.lib n’est pas lié correctement. Pour ce faire, cliquez avec le bouton droit sur votre projet dans l’explorateur de solutions, accédez à l’éditeur de liens -> input et ajoutez ws2_32.lib à d’autres dépendances. Cette bibliothèque fait partie de Windows SDK (je suppose qu’elle est installée avec la plupart des versions de Visual Studio). Assurez-vous donc que le fichier existe sur votre ordinateur.

Et maintenant comment faire un projet correct dans un style moderne sans suivre d’anciens tutoriels:

La bibliothèque à append est Winsock2.h. Winsock.h est l’ancienne version (obsolète) et il n’est pas nécessaire de l’utiliser dans de nouvelles applications. Pour commencer à utiliser les sockets, vous devez appeler la fonction WSAStartup, pour cela vous devez initialiser struct WSADATA au début. Le morceau de code de base ressemble à ceci:

 #include  int main() { WSADATA mywsadata; //your wsadata struct, it will be filled by WSAStartup WSAStartup(0x0202,&mywsadata); //0x0202 refers to version of sockets we want to use. //here goes your code with socket related things return 0; } 

Pour plus d’aide, vous pouvez visiter ici

Une note: puisque la question est ancienne et que je ne suis pas sûr que son auteur trouvera ma réponse utile, je veux aider d’autres utilisateurs à regarder cette question.