Unix(Linux) C++ 下支持timeout的connect()的实现例子
java 的connect有timeout这个功能,C++的connect反而没有? 网查得到了两个实现的版本如下:
支持timeout的connect() / Connect with timeout
Code:
void connect_w_to(void) {
int res;
struct sockaddr_in addr;
long arg;
fd_set myset;
struct timeval tv;
int valopt;
socklen_t lon;
// Create socket
soc = socket(AF_INET, SOCK_STREAM, 0);
if (soc < 0) {
fprintf(stderr, "Error creating socket (%d %s)\n", errno, strerror(errno));
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(2000);
addr.sin_addr.s_addr = inet_addr("192.168.0.1");
// Set non-blocking
if( (arg = fcntl(soc, F_GETFL, NULL)) < 0) {
fprintf(stderr, "Error fcntl(..., F_GETFL) (%s)\n", strerror(errno));
exit(0);
}
arg |= O_NONBLOCK;
if( fcntl(soc, F_SETFL, arg) < 0) {
fprintf(stderr, "Error fcntl(..., F_SETFL) (%s)\n", strerror(errno));
exit(0);
}
// Trying to connect with timeout
res = connect(soc, (struct sockaddr *)&addr, sizeof(addr));
if (res < 0) {
if (errno == EINPROGRESS) {
fprintf(stderr, "EINPROGRESS in connect() - selecting\n");
do {
tv.tv_sec = 5 //overtime;
tv.tv_usec = 0;
FD_ZERO(&myset);
FD_SET(soc, &myset);
res = select(soc+1, NULL, &myset, NULL, &tv);
if (res < 0 && errno != EINTR) {
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
exit(0);
}
else if (res > 0) {
// Socket selected for write
lon = sizeof(int);
if (getsockopt(soc, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) < 0) {
fprintf(stderr, "Error in getsockopt() %d - %s\n", errno, strerror(errno));
exit(0);
}
// Check the value returned...
相关文档:
关注Android,关注Google 前日Linux Kernel维护者Greg Kroah-Hartman把Android代码从Linux Kernel代码库中删除的消息引来了广泛关注,开发界已有很多评论对此事进行讨论。ifanr今日提供了当天Greg声明的全译文,下面就让我们来看看。 2.6.33 版内核移除了Android的代码。很多人不断地问我发生了什么,对于And ......
一、安装JDK
安装包名为:jdk-1_5_0_18-linux-i586.rpm.bin
安装步骤:
1. 以root身份登录Linux操作系统
2. 将jdk-1_5_0_18-linux-i586.rpm.bin安装包上传到/tmp目录下, 检测确保jdk-1_5_0_18-linux-i586.rpm.bin有可执行权限;
如果jdk-1_5_0_18-linux-i586.rpm.bin没有可执行权限,可使用一下命令添加
#c ......
1.概念
在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法. ......
Linux version
[1] 2.6.10
2.6 version number, 10 release number
[2] 2.6.10 and 2.6.11
They can differ significantly even in core components and in fundamental algorithms
[3] 2.6.11.12
when a new kernel release appears, it is potentially unstable and buggy. To address this problem, the kern ......
一.Linux内存管理的一些基本概念
内存空间:
绝大多数的嵌入式系统的系统内存和I/O地址空间是统一编址的,内存和I/O地址空间共享0x00000000~0xFFFFFFFF共4GB地址空间范围,这4GB的地址空间范围包括以下几种存储空间:设备空间、内部高速SRAM空间、内 ......