台灣最大程式設計社群網站
線上人數
3206
 
會員總數:245964
討論主題:189547
歡迎您免費加入會員
討論區列表 >> C/C++ >> 請教 Socket select 用法
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請教 Socket select 用法
價值 : 10 QP  點閱數:168 回應數:1
樓主

Blue
初學者
322 94
1058 172
發送站內信

Hi,各位先進大家好:
小弟要寫等待自網路來的UDP封包並回應,
如下,使用select來等 3秒,
在 Ubuntu 這個程式會讓CPU跑100%,
實在不解,
1.一執行,不會先印出 00000,會等 3 秒後連同 aaaaaa一併印出
2.之後不會再等3秒,直接連續印出 00000aaaaaa
請教 Select 不是應該要等待 Timeout嗎?
謝謝!

int selectReturn;
fd_set rfd;
timeval timeout= {3,0};
/*
timeout.tv_sec = 3;// 單位:秒;
timeout.tv_usec = 0;// 單位:豪秒;
*/
gethostname(name, sizeof(name));
while(true){
FD_ZERO(&rfd);
FD_SET(sockfd, &rfd);
printf("00000");
selectReturn = select(sockfd+1, &rfd, NULL, NULL, &timeout);
printf("aaaaaa");
if(selectReturn == -1){
printf("select()/n");
close(sockfd);
exit(-1);
}else{
if(FD_ISSET(sockfd, &rfd)) {
len = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&ClientAddr,&AddrLen);
if(len>0){
buf[len]=0;
/* print received message */
printf("%s: from %s:UDP%u : %s \n", argv[0],inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port),buf);
strcpy(buf, "ID=");
strcat(buf, name);
len = strlen(buf);
sendto(sockfd,buf,len,0,(struct sockaddr *)&ClientAddr,AddrLen);
}else{
break;
}
}
}
}
close(sockfd);
return 0;





搜尋相關Tags的文章: [ Socket select ] ,
本篇文章發表於2020-04-20 11:43
1樓
作者回應

Blue
檢舉此回應
已解,
原因是 selectReturn = select(sockfd+1, &rfd, NULL, NULL, &timeout);
會改變 timeout 的值,
謝謝!
本篇文章回覆於2020-04-23 09:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.