Définir le délai d'attente pour winsock recvfrom
Je vais essayer de mettre en place un blocage de la prise de délai d'attente après 16 ms d'essayer de recvfrom() sur un port. Plate-forme Windows. J'ai regardé des tonnes d'exemples en ligne et il semble vraiment simple que je n'arrive pas à le faire fonctionner. Toute aide serait appréciée!
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#define PORT_NUM 8001
int main(void)
{
std::string localIP;
sockaddr_in localAddr;
sockaddr_in remoteAddr;
hostent* localhost;
char buffer[1024];
WSADATA wsData;
int result = WSAStartup(MAKEWORD(2,2), &wsData); //winsock version 2
localhost = gethostbyname("");
localIP = inet_ntoa(*(in_addr*)*localhost->h_addr_list);
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(PORT_NUM); //Set Port Number
localAddr.sin_addr.s_addr = inet_addr(localIP.c_str()); //Set IP Address
int mHandle = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
if(mHandle == INVALID_SOCKET)
return 1;
if(bind(mHandle, (SOCKADDR*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
return 1;
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1600;
//Set Timeout for recv call
if(setsockopt(mHandle, SOL_SOCKET, SO_RCVTIMEO,
reinterpret_cast<char*>(&tv), sizeof(timeval)))
return 1;
int length = sizeof(remoteAddr);
//<-- Blocks here forever
recvfrom(mHandle, buffer, 1024, 0, (SOCKADDR*)&remoteAddr, &length);
return 0;
}
/* I've also tried passing the time like so:
int ms = 16;
if(setsockopt(mHandle, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&ms), sizeof(int)))
return 1; */
source d'informationauteur Cory Carlson
Vous devez vous connecter pour publier un commentaire.
J'ai regardé dans la fonction de sélection et que laura a dit que je devrais faire et il a obtenu le travail réel facilement! Merci!
Je l'ai essayé en le passant comme le folloing
et l'exécuter!!
WINDOWS:
Valeur de délai d'expiration est une valeur DWORD en millisecondes, de l'adresse transmise à setsockopt() est de type const char *
LINUX:
Valeur de délai d'expiration est une struct timeval, l'adresse transmise à setsockopt() const void *
Source: http://forums.codeguru.com/showthread.php?t=353217
Je devine Windows à partir de la WSASocket (). Si vous êtes de passage le délai d'attente de manière incorrecte.
MSDN dit que SO_RCVTIMEO prend un int param qui spécifie le délai d'attente en millisecondes (ms).