我的localhost上运行了一个tcp服务器。我的程序连接到此tcp服务器,该服务器响应连接数据。我在程序的其他地方使用信号,所以我需要这个是非阻塞的。
不幸的是,我还需要使用clock_gettime
。当我这样做时,tcp连接挂起。
我能想到的唯一选择是使用管道,切换到udp,但这两个不是理想的结果。
相关代码如下:
....
std::string tcpsens::getstr(void){
int outsock;
struct sockaddr_in servaddr;
outsock = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = ip_addr;
servaddr.sin_port=htons(port);
if (fcntl(outsock, F_SETFL, O_NDELAY | O_NONBLOCK) < 0) {
perror("Can't set socket to non-blocking");
exit(0);
}
connect(outsock, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1) {
buflen=recv(outsock,buf,255,0);
if (buflen>0){
buflen=-1;}
else if (buflen==0){
break;}
//sleep(1);
//printf("still looping.\n");
}
close(outsock);
return buf;
}
float tcpsens::gettruespeed(){
float speed,val;
buffer = getstr();
sscanf(buffer.c_str(),"%f,%f\n",&speed,&val);
return speed;}
...
#include <stdio.h>
#include "tcpsens.h"
#include <string>
#include <iostream>
#include <sys/time.h>
#include <time.h>
int main(void){
//timing functions
//struct timespec timer;
// initialize the tcpsensor
tcpsens t;
// connect to tcp and get sensor and speed reading
std::cout << "TEST WITHOUT INITIALIZING TIMESPEC:\n\n";
std::cout << "expecting value of ~0.00, got " << t.gettruespeed() << "\n";
std::cout << "expecting value ~0.00, got " << t.getsensval() << "\n";
return 0;
}
使用$ g++-4.7 -std=c++11 testtcp1.cpp -lrt
编译,给出结果
$ ./a.out
TEST WITHOUT INITIALIZING TIMESPEC:
expecting value of ~0.00, got 0
expecting value ~0.00, got 0
与testtcp1.cpp相同,除了取消注释行struct timespec timer;
并更改消息。给出结果
$ ./a.out
TEST WITH INITIALIZING TIMESPEC:
永远挂起。
答案 0 :(得分:0)
它不会挂起,它会旋转,因为你处于非阻止模式,你忽略了错误,并且你正在招致buflen == -1
只要没有数据,就errno == EAGAIN/EWOULDBLOCK
。使用阻止模式,或者至少正确处理错误。