Неблокируемый сокет TCP зависает при инициализации timepec (C ++)

У меня есть TCP-сервер, работающий на моем локальном хосте. Моя программа подключается к этому tcp-серверу, который отвечает данными о подключении. Я использую сигналы в других местах программы, поэтому мне нужно, чтобы это было неблокирующим.
К сожалению, мне также нужно использовать clock_gettime, Когда я это делаю, соединение tcp зависает.
Единственные альтернативы, которые я могу придумать, — это использовать каналы, переключиться на udp, но эти два результата не являются желаемыми.
Соответствующий код ниже:

tcpsens.h:

....
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;}
...

testtcp1.cpp

#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

testtcp2.cpp

так же, как testtcp1.cpp, за исключением строки без комментария struct timespec timer;и изменение сообщения. дает результат

$ ./a.out
TEST WITH INITIALIZING TIMESPEC:

и висит навсегда.

1

Решение

Он не зависает, он вращается, потому что вы находитесь в неблокирующем режиме, игнорируете ошибки и несете buflen == -1 а также errno == EAGAIN/EWOULDBLOCK когда нет данных. Используйте режим блокировки или, по крайней мере, правильно обрабатывайте ошибки.

0

Другие решения


По вопросам рекламы [email protected]