【问题标题】:Setup IP Address info from unsigned int in C从 C 中的 unsigned int 设置 IP 地址信息
【发布时间】:2015-01-29 21:04:13
【问题描述】:

我在代码中遇到了关于发送内容的问题。

例如,我有 2 个服务器。

这是服务器 1:

unsigned int ip = 19216821;
unsigned int port = 4000;

char str[0];
sprintf(str, "%d", ip);
if ((dest_he=gethostbyname(str)) == NULL) {  // get the host info
        herror("gethostbyname");
        exit(1);
}

dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(port);
dest_addr.sin_addr = *((struct in_addr *)dest_he->h_addr);
memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);

然后我想将我的缓冲区发送到 dest_addr

if(sendto(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&dest_addr ,sizeof(struct sockaddr_storage)) == -1){
        printf("error sending data\n");
        return -1;
}

但我仍然得到 sendto(..) == -1。

我的另一台服务器仍在等待答复。 服务器 2:

if(recvfrom(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&rand_addr ,&addr_size) == -1){
        printf("error receiving data");
        return -1;
}

我认为我的问题是我设置了 dest_addr 错误还是?

【问题讨论】:

  • 也许您想为主机名字符串分配一些内存(而不是char str[0])?此外,如果您想查找 IPv4 地址(例如 192.168.2.1),那么您需要在字符串中包含点(这意味着您必须实现一个函数来转换您的 unsigned int 表示,一些比如ip = (192<<24)|(168<<16)|(2<<8)|1; sprintf("%d.%d.%d.%d", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff))。
  • @SleuthEye 哦,不错。现在,如果我将“localhost”放在我的 gethostname 而不是 str 中,它现在可以工作。有没有办法可以在没有这个 sprintf 的情况下将 int 转换为字符串?我找不到关于它的东西。而且 str[0] 不知何故困扰着我。你知道我怎样才能让它动态而不是[0]吗?还是 [0] 足够大?
  • unsigned int ip = 19216821; 不是存储192.168.2.1 的好方法,如果这就是你的意思
  • [0] 足够大吗? 从不 [0] 足够大。

标签: c sockets tcp connection server


【解决方案1】:

首先,您的标题与您的描述不符。不过我会尽力回答你的问题。

基本上,您没有正确使用函数gethostbyname。顾名思义,它通过名称而不是地址获取主机。因此,正确的用法是:

struct hostent *host = gethostbyname("localhost");

要将结果复制到您的struct,您可以使用:

memcpy(&dest_addr.sin_addr, host->h_addr_list[0], host->h_length);

另一方面,如果您想向已知 IP 地址发送消息,您可以使用:

char *ip = "127.0.0.1"
inet_aton(ip , &dest_addr.sin_addr)

除此之外,一切看起来都很好。网上有很多关于如何使用 TCP、UDP 甚至 RAW 套接字的示例。我希望这是你所期待的答案。

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 2015-01-11
    • 1970-01-01
    • 2011-10-02
    • 2013-11-01
    • 1970-01-01
    • 2021-10-02
    • 2016-04-18
    • 2022-06-12
    相关资源
    最近更新 更多