c - in_addr_t变量作为连接的参数

时间:2017-10-03 15:10:40

标签: c sockets tcp ip-address

我有一个connect()类型的变量,我想在给定的ip中使用(struct sockaddr *)。因此,我需要connect()变量作为in_addr_t的参数。如何插入使用in_addr_t var; // Given variable, not actually declared here ofc int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in *srvraddr = malloc(sizeof(struct sockaddr_in)); memset((void *) srvraddr, 0, sizeof(struct sockaddr_in)); srvraddr->sin_family = AF_INET; srvraddr->sin_port = htons(PORT_A); // Big - little endian arch compatibility srvraddr->sin_addr.s_addr = var; // Somehow assign var here? <<<<< connect(sockfd, (struct sockaddr *) srvraddr, sizeof(struct sockaddr_in)); 变量?

-1

无论我尝试做什么,连接总是返回perror。 使用Connection refused我收到以下错误:String uniqueString = Long.toString(id, 35); uniqueString = uniqueString.replace('o', 'z'); uniqueString = uniqueString.toUpperCase();

2 个答案:

答案 0 :(得分:2)

  

如何插入使用in_addr_t变量?

您不能将in_addr_tconnect()一起使用,而不是struct sockaddr_inconnect()接受不同的地址结构类型,但不接受任意地址结构类型。 IPv4地址的正确结构类型是您已使用的struct sockaddr_in。您需要在其中存储远程主机地址的适当表示。

显然,你已经有in_addr_t断言代表远程地址,但不确定如何使用它:

in_addr_t var; // Given variable, not actually declared here ofc
     

[...]

srvraddr->sin_addr.s_addr = var; // Somehow assign var here? <<<<<

然而,您所呈现的内容正是POSIX所期望的。 POSIX要求sin_addr的{​​{1}}成员是至少具有struct sockaddr_in s_addr类型成员的结构。假设您拥有的in_addr_t实际上是您要连接的机器地址的正确表示,那么将该值分配给您的地址结构的in_addr_t是正确的。原则上,该结构可能有更多成员,但在实践中,希望可互操作的实现不需要您设置任何其他成员。大多数人根本没有其他成员。

但请注意,仅仅因为sin_addr.s_addr通过指针接收地址结构并不意味着您需要使用动态分配。这样做会更加惯用:

connect()

除此之外,还可以节省您之后释放内存的费用。

  

无论我尝试做什么,连接总是返回-1。使用perror我收到以下错误:连接被拒绝。

据我所知,您提供的代码很好。您可能想要检查首先获取int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in srvraddr = { 0 }; srvraddr.sin_family = AF_INET; srvraddr.sin_port = htons(PORT_A); srvraddr.sin_addr.s_addr = var; connect(sockfd, (struct sockaddr *) &srvraddr, sizeof(srvraddr)); 值的方式,并验证您使用的端口号。另一方面,不要忽视问题出在远程主机的可能性:您尝试连接的端口可能不是打开的(对您而言)。

答案 1 :(得分:-1)

这是我使用connect()在端口80上获得与“example.com”的连接的方法:

#include <stdio.h>
#include <netdb.h>
#include <unistd.h>

int main(void)
{
  int sockfd;

  if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    fprintf(stderr, "socket");
    return 0;
  }

  char domain[] = "example.com";
  struct hostent *he;
  he = gethostbyname (domain);
  if (!he)
  {
    switch (h_errno)
    {
    case HOST_NOT_FOUND:
      fputs ("The host was not found.\n", stderr);
      break;
    case NO_ADDRESS:
      fputs ("The name is valid but it has no address.\n", stderr);
      break;
    case NO_RECOVERY:
      fputs ("A non-recoverable name server error occurred.\n", stderr);
      break;
    case TRY_AGAIN:
      fputs ("The name server is temporarily unavailable.", stderr);
      break;
    }
    return 1;
  }
  if (he->h_length < 4)
    return 1;

  struct sockaddr_in srvraddr;
  srvraddr.sin_len = sizeof(srvraddr);
  srvraddr.sin_family = AF_INET;
  srvraddr.sin_port = htons(80);

  srvraddr.sin_addr = * (struct in_addr *) he->h_addr_list[0];

  if (connect(sockfd, (struct sockaddr*)&srvraddr, srvraddr.sin_len) == -1) {
    fprintf(stderr,"connect() failed\n");
    return 1;
  }

  // Use conection here...

  close(sockfd);
  return 0;
}