【问题标题】:Unable to copy ip address from string to sockaddr_in无法将 IP 地址从字符串复制到 sockaddr_in
【发布时间】:2016-10-23 15:58:37
【问题描述】:

我正在尝试将 IP 地址从字符串复制到 struct sockaddr_in 但不知何故弹出了一些错误。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    char *buf = "128.10.25.102:30015";
    char ip[30];
    struct sockaddr_in s1_addport;
    int i = 0;

    while (buf[i] != ':') i++;
    strncpy(ip, &buf[0], i);
    ip[strlen(ip)] = '\0';

    printf("ip: %s, strlen:%zu\n",ip,strlen(ip));
    inet_aton(ip,&s1_addport.sin_addr);
    printf("Server IP: %s\n",inet_ntoa(s1_addport.sin_addr));
    return 0;
}

以上代码的输出显示:

ip: 128.10.25.102, strlen:13  
Server IP: 0.0.0.0

ip 字符串复制值时出现一些错误,我无法弄清楚。可能是什么原因?

【问题讨论】:

  • 弹出什么错误?
  • 你试过用inet_pton代替inet_aton吗?
  • 没有弹出错误。 server_IP 显示为 0.0.0.0 而不是 128.10.25.102。很抱歉造成混乱
  • 如果我将此代码充实为一个完整的、可编译的测试程序,我将无法重现该问题。我注意到我必须做出的更改之一是在两个地方将s3_addport 更改为s1_addport。您的 real 代码可能有类似的拼写错误,例如您将地址写入一个sockaddr_in,然后从另一个地址读回。

标签: c sockets sockaddr-in


【解决方案1】:

这是您的 pastebin 代码中的问题:

ip[strlen(ip)]='\0';

(尝试附加空终止符但使用 strlen,它本身取决于是否存在空终止符)。

这里是修复:

....
while(buf[i]!=':')
    i++;
strncpy(ip,&buf[0],i);
ip[i]='\0';
puts(ip);
....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2023-04-11
    • 2013-04-13
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2023-03-05
    • 2020-05-06
    相关资源
    最近更新 更多