我试图在UDP套接字上设置100ms超时.我正在使用C.我在下面发布了我的代码的相关部分.我不确定为什么这不是超时,但只是在它没有收到段时挂起.这仅适用于未使用bind()方法绑定的套接字吗?
#define TIMEOUT_MS 100 /* Seconds between retransmits */
if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
DieWithError("socket() failed");
if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
DieWithError("socket() failed");
//set timer for recv_socket
static int timeout = TIMEOUT_MS;
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
(struct sockaddr *) &servAddr2, &fromSize) < 0){
//timeout reached
printf("Timout reached. Resending segment %d\n", seq_num);
num_timeouts++;
}
Run Code Online (Sandbox Code Playgroud)
Nea*_*eal 52
该SO_RCVTIMEO
选项需要一个struct timeval
定义的sys/time.h
,而不是像你传递给它的整数.在timeval struct
为拥有秒字段和毫秒字段.要将超时设置为100毫秒,以下应该可以解决问题:
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
perror("Error");
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我也有同样的问题。我尝试采用您建议的解决方案,使用timeval
struct. 但这似乎不起作用。
我读过微软文档,时间应该是DWORD
毫秒数,但还有另一件事要做,如果使用该WSASocket
函数创建套接字,则dwFlags
参数必须设置WSA_FLAG_OVERLAPPED
超时功能的属性适当地。否则超时永远不会生效。
归档时间: |
|
查看次数: |
63735 次 |
最近记录: |