Je suis en train de lire ces paquets UDP entrants en utilisant Wireshark:Essayer de recevoir des paquets UDP entrants, le tampon vide
J'utilise le code suivant:
struct sockaddr_in si_other;
struct sockaddr_in remaddr; /* remote address */
int slen = sizeof(remaddr);
int s, recvlen;
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//create socket
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) //IPPROTO_UDP
{
printf("socket() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
//setup address structure
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
if (bind(s, (struct sockaddr *)&si_other, sizeof(si_other)) < 0) {
perror("bind failed");
return 0;
}
u_long nMode = 1; // 1: NON-BLOCKING
if (ioctlsocket(s, FIONBIO, &nMode) == SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return 0;
}
//start communication
while (1)
{
printf("waiting on port %d\n", PORT);
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
{
printf("recvfrom() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Done");
puts(buf);
}
Le adresse que je lie est 192.168.1.1 et le port 1234.
Et la sortie donnée par WSAGetLastError est une erreur de mémoire tampon vide: 10035
J'ai essayé de déconnecter le mur à l'épreuve du feu, l'antivirus ... et j'exécute le programme en tant qu'administrateur, et cela n'a pas aidé.
Pourquoi le tampon est-il vide? Je vois clairement qu'il y a des paquets qui arrivent, qu'est-ce qui pourrait bloquer les données entrantes à la socket?
Pourquoi ne pas bloquer? – Jonas
Parce qu'avec non-bloquant je suis capable de lire l'erreur et de voir que le tampon est vide, sinon le programme s'arrête sur la fonction recvfrom ... – joe
Mais s'il n'est pas bloquant l'appel pourrait retourner simplement parce qu'il n'y a pas de données disponible pour le moment. Quelle est l'erreur - 'EAGAIN' ou' EWOULDBLOCK'? –