Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Berkley套接字和读取超时_C++_Sockets_Berkeley Sockets - Fatal编程技术网

C++ Berkley套接字和读取超时

C++ Berkley套接字和读取超时,c++,sockets,berkeley-sockets,C++,Sockets,Berkeley Sockets,我的系统是运行Ubuntu的ARM上的C++系统 当我尝试执行阻塞读取时,我遇到了一些Berkley套接字问题,我得到了一个错误,代码是EAGAIN。我在代码中加入了一个计时器,发现错误发生在套接字超时之前。我看了看我正在连接的设备,但插座没有关闭 我不知道这有什么关系,但似乎只有当我在gdb下运行程序时才会发生这种情况……至少这是我唯一一次注意到它 下面是代码的简化版本。我已进行了错误检查,以使其更小 int optval; struct timeval tv; // Set up the

我的系统是运行Ubuntu的ARM上的C++系统

当我尝试执行阻塞读取时,我遇到了一些Berkley套接字问题,我得到了一个错误,代码是EAGAIN。我在代码中加入了一个计时器,发现错误发生在套接字超时之前。我看了看我正在连接的设备,但插座没有关闭

我不知道这有什么关系,但似乎只有当我在gdb下运行程序时才会发生这种情况……至少这是我唯一一次注意到它

下面是代码的简化版本。我已进行了错误检查,以使其更小

int optval;
struct timeval tv;

// Set up the sockaddrIn structures for the port
struct sockaddr_in controlTcpAddr;
memset(&controlTcpAddr, 0, sizeof(controlTcpAddr));    // Clear struct
controlTcpAddr.sin_family = AF_INET;                   // Internet/IP
controlTcpAddr.sin_addr.s_addr = inet_addr(hostIp);    // IP address
controlTcpAddr.sin_port = htons(hostPort);             // server port

// Create the TCP socket
myControlTcpSockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
// Establish connection
connect(myControlTcpSockDesc, (struct sockaddr *) &controlTcpAddr, sizeof(controlTcpAddr);
int flags = fcntl(myControlTcpSockDesc, F_GETFL);
int result = fcntl(myControlTcpSockDesc, F_SETFL, flags & ~O_NONBLOCK);

// Set the SO_REUSEADDR option for the socket
optval = 1;
setsockopt(myControlTcpSockDesc, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)

tv.tv_sec = 10;  // 10 Secs Timeout
tv.tv_usec = 0;
setsockopt(myControlTcpSockDesc, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));

// try a read
cnt = read(myControlTcpSockDesc, myIncomingMsgBuf, MESSAGE_BUFFER_SIZE);
// at this point I find that 10 seconds have not expired 
//    (I have separate timer running that is not shown)
// cnt = -1
// errno = EAGAIN

是否确定已成功将套接字设置为非阻塞?如果读取将阻塞,则在阻塞套接字上返回EAGAIN。检查fcntl()的返回值。已检查,返回值为0…成功。顺便说一句:这个错误只是偶尔发生。