因为项目需要,需要快速知道某个IP和端口是否可达(一秒内),用过connect,这个函数会有几秒的时间的检测,不太符合我的需求,大家还有什么别的解决办法吗?
6条回答 默认 最新
- I_belong_to_jesus 2018-03-15 06:26关注
setsockopt函数可以设定socket连接、接收和发送等的响应时间,可以通过在connect之前设置SO_SNDTIMO来达到控制连接超时的目的。
#include
#include
#include
#include
#include
#include
#include
#include
#includeint main(int argc, char *argv[])
{
int fd;
struct sockaddr_in addr;
struct timeval timeo = {3, 0};
socklen_t len = sizeof(timeo);fd = socket(AF_INET, SOCK_STREAM, 0); if (argc == 4) timeo.tv_sec = atoi(argv[3]); setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[1]); addr.sin_port = htons(atoi(argv[2])); if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { if (errno == EINPROGRESS) { fprintf(stderr, "timeout/n"); return -1; } perror("connect"); return 0; } printf("connected/n"); return 0;
}
使用 ./cmd ip地址 端口 超时秒数
(测试的ip和端口必须是不存在的,或者是ip的机器是死掉的,才会出现,否则机器存在而端口不存在会立即返回的)
可以通过查看errno来查看错误类型来确定无法连接的原因。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 3
悬赏问题
- ¥100 求数学坐标画圆以及直线的算法
- ¥35 平滑拟合曲线该如何生成
- ¥100 c语言,请帮蒟蒻写一个题的范例作参考
- ¥15 名为“Product”的列已属于此 DataTable
- ¥15 安卓adb backup备份应用数据失败
- ¥15 eclipse运行项目时遇到的问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 自己瞎改改,结果现在又运行不了了
- ¥15 链式存储应该如何解决