如何检查C中特定端口是否可以访问远程主机?

时间:2015-05-14 11:58:53

标签: c sockets

我正在编写一个C程序来检查远程主机是否响应特定端口(在我的情况下,应用程序在远程端的9090上运行)。最初我试过了 nc -zv <host> <port>使用system()函数调用但无法获得所需的结果。 现在,我创建了一个非阻塞套接字并使用connect()调用来检查相同的内容。但它返回-1并设置errno -115(正在进行操作) 在网上搜索后我得到了使用select()poll()的想法,但我无法了解如何实现这些。 任何有示例程序的建议都会有所帮助。

2 个答案:

答案 0 :(得分:4)

完全按照阻止模式进行操作。

或者,确切地说你正在做什么,然后将套接字FD添加到writeFD​​s集并调用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或名称)和端口并立即关闭套接字。