Comment puis-je recevoir des paquets udp avec winsock en c++?

Comme une tentative à envelopper ma tête autour de sockets udp j'ai essayé de port le code de ce tutoriel page http://www.linuxhowtos.org/C_C++/socket.htm de winsock (en cours d'exécution sur win 8 si c'est important). [liens directs ci-dessous]

Le code compile et s'exécute, mais je n'ai jamais recevoir un paquet, les deux programmes, il suffit d'attendre et de bloquer sur recvfrom(). Je continue à avoir ce même problème (par exemple avec une version modifiée de ce code https://stackoverflow.com/a/679529/873217 qui comprend un recvfrom() de l'appel. Et avec ce code C++ problème avec Datagramme (UDP)winsocket à sendto et recvfrom sur le même socket par le biais de la carte de bouclage faire les modifications proposées). J'imagine que je suis en train de faire quelques simples et fondamentaux de l'erreur; mais je suis incapable de le trouver sur mon propre. J'espère que quelqu'un avec plus d'expérience peut briller un peu de lumière sur cette question pour moi. Merci.

Remarques supplémentaires:

Je suis en cours d'exécution du serveur exe, puis le client exe sur le même ordinateur. Il est connecté à l'internet. Et j'ai essayé d'utiliser un domaine qui correspond à mon adresse IP. J'ai aussi essayé de désactiver le pare-feu, si j'ai permis à la fois des programmes d'accès complet.

liens directs vers les sites code client et serveur:

http://www.linuxhowtos.org/data/6/client_udp.c

http://www.linuxhowtos.org/data/6/server_udp.c

Ma tentative:

à la fois liée à libws2_32.un

code client:

#include <stdio.h>
#include <winsock2.h>
#include <string.h>
void error(const char *);
int main()
{
WSAData data;
WSAStartup( MAKEWORD( 2, 2 ), &data );
int sock, n;
int length;
struct sockaddr_in server, from;
struct hostent *hp;
char buffer[256];
unsigned short serverPort = 27072;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) error("socket");
server.sin_family = AF_INET;
hp = gethostbyname("localhost");//have also tried my url
if (hp==0) error("Unknown host");
memmove((char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length);
server.sin_port = htons(serverPort);
length = sizeof(struct sockaddr_in);
printf("Please enter the message: ");
memset(buffer, 0, 256);
fgets(buffer, 255, stdin);
n = sendto (sock, buffer, strlen(buffer), 0, (const struct sockaddr *)&server, length);
if (n < 0) error("Sendto");
printf("sent %i bytes\n", n);
n = recvfrom(sock, buffer, 256, 0, (struct sockaddr *)&server, &length);
if (n < 0) error("recvfrom");
//write(1,"Got an ack: ", 12);
//write(1, buffer, n);
printf("Got msg: %s\n",buffer);
closesocket(sock);
WSACleanup();
return(0);
}
void error(const char *msg)
{
perror(msg);
exit(0);
}

code serveur:

#include <stdio.h>
#include <winsock2.h>
#include <string.h>
void error(const char *);
int main()
{
WSAData data;
WSAStartup( MAKEWORD( 2, 2 ), &data );
int sock, length, n;
int fromlen;
struct sockaddr_in server;
struct sockaddr_in from;
char buf[1024];
unsigned short serverPort = 27072;
sock=socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) error("Opening socket");
length = sizeof(server);
memset(&server, 0, length);
server.sin_family = AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(serverPort);
if (bind(sock,(struct sockaddr *)&server, length)<0) error ("binding");
fromlen = sizeof(struct sockaddr_in);
while(1)
{
n = recvfrom(sock, buf, 1024, 0, (struct sockaddr *)&from, &fromlen);
if (n<0) error("recvfrom");
//write(1,"Received a datagram: ", 21);
//write(1,buf,n);
printf("Received a datagram: %s", buf);
n = sendto(sock, "Got your message\n",17,0,(struct sockaddr *)&from,fromlen);
if (n<0)error("sendto");
}
closesocket(sock);
WSACleanup();
return 0;
}
void error (const char *msg)
{
perror(msg);
exit(0);
}
  • Ont trouvé un exemple ici: codeproject.com/articles/11740/... HTH
  • Merci je vais vérifier ça.
  • Wireshark peut parfois être un outil utile pour déboguer ce type de réseau, des problèmes de code, car il va vous montrer ce qu'paquets, le cas échéant, ont été échangées entre le client et le serveur. Cela devrait vous dire de quel programme vous devez déboguer les premiers.
  • Le faire fonctionner sur 'localhost', (127.0.0.1), d'abord.
  • Merci, j'ai téléchargé wireshark hier. Je vais essayer de l'utiliser aujourd'hui.
  • Je l'ai vérifié. le code est fine et de travail. Vérifiez si vous utilisez le même numéro de port attribué dans le code serveur.

InformationsquelleAutor Adam Phelps | 2013-02-02