gpt4 book ai didi

c - 为 winsock recvfrom 设置超时

转载 作者:太空狗 更新时间:2023-10-29 16:31:25 25 4
gpt4 key购买 nike

我正在尝试设置一个阻塞套接字,使其在尝试在端口上接收 recvfrom() 16 毫秒后超时。平台是Windows。我在网上看了很多例子,看起来真的很简单,但我似乎无法让它发挥作用。任何帮助将不胜感激!

#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; */

最佳答案

我查看了 select 函数,正如 laura 所说我应该做的那样,并且让它真正轻松地工作!谢谢!

fd_set fds ;
int n ;
struct timeval tv ;

// Set up the file descriptor set.
FD_ZERO(&fds) ;
FD_SET(mHandle, &fds) ;

// Set up the struct timeval for the timeout.
tv.tv_sec = 10 ;
tv.tv_usec = 0 ;

// Wait until timeout or data received.
n = select ( mHandle, &fds, NULL, NULL, &tv ) ;
if ( n == 0)
{
printf("Timeout..\n");
return 0 ;
}
else if( n == -1 )
{
printf("Error..\n");
return 1;
}

int length = sizeof(remoteAddr);

recvfrom(mHandle, buffer, 1024, 0, (SOCKADDR*)&remoteAddr, &length);

关于c - 为 winsock recvfrom 设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com