我正在编写一个C程序来检查远程主机是否响应特定端口(在我的情况下,应用程序在远程端的9090上运行)。最初我试过了
nc -zv <host> <port>
使用system()函数调用但无法获得所需的结果。
现在,我创建了一个非阻塞套接字并使用connect()调用来检查相同的内容。但它返回-1并设置errno -115(正在进行操作)
在网上搜索后我得到了使用select()
和poll()
的想法,但我无法了解如何实现这些。
任何有示例程序的建议都会有所帮助。
答案 0 :(得分:4)
完全按照阻止模式进行操作。
或者,确切地说你正在做什么,然后将套接字FD添加到writeFDs集并调用select().
如果FD显示为可写,则连接成功。
不要忘记关闭插座。
但我想知道你为什么这么做。只需尝试连接到您需要连接的任何内容,此时您需要这样做。不要试图预测它是否会成功。
答案 1 :(得分:1)
据我所知,你只会做一个简单的连接。应该在阻止模式中进行此操作。 这是一个例子:
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/un.h>
in_addr_t in_build_addr(const char * p_server)
{
in_addr_t addr = inet_addr(p_server);
if(INADDR_NONE == addr) {
struct hostent * server_info = gethostbyname(p_server);
if(NULL == server_info) {
return 0;
}
memcpy(&addr, server_info->h_addr_list[0], server_info->h_length);
}
return addr;
}
int check_connect(const char * p_server, in_port_t p_port) {
int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(0 > sock) {
return -1;
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(p_port),
.sin_addr.s_addr = in_build_addr(p_server)
};
if(0 != connect(sock, (struct sockaddr *)&addr, sizeof(addr))) {
close(sock);
return -2;
}
close(sock);
return 0;
}
您可以尝试使用_check_connect_函数。此函数连接到给定服务器(ip或名称)和端口并立即关闭套接字。