Не удается скопировать ip-адрес из строки в sockaddr_in

#c #sockets #sockaddr-in

#c #сокеты #sockaddr-in

Вопрос:

Я пытаюсь скопировать 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, amp;buf[0], i);
    ip[strlen(ip)] = '';

    printf("ip: %s, strlen:%zun",ip,strlen(ip));
    inet_aton(ip,amp;s1_addport.sin_addr);
    printf("Server IP: %sn",inet_ntoa(s1_addport.sin_addr));
    return 0;
}
  

Вывод приведенного выше кода показывает:

 ip: 128.10.25.102, strlen:13  
Server IP: 0.0.0.0
  

При копировании значения из ip строки возникает некоторая ошибка, которую я не могу определить. В чем может быть причина?

Комментарии:

1. Какая ошибка появляется?

2. Вы пробовали использовать inet_pton вместо inet_aton ?

3. ошибка не выводится. server_IP отображается как 0.0.0.0 вместо 128.10.25.102. Извините за путаницу

4. Если я добавлю этот код в полную, компилируемую тестовую программу, я не смогу воспроизвести проблему. Я отмечаю, что одним из изменений, которые мне пришлось внести, было изменение s3_addport на s1_addport в двух местах. Вполне вероятно, что в вашем реальном коде есть похожие опечатки, так что вы записываете адрес в один sockaddr_in , а затем считываете его с другого.

5. @re3el pastebin.com/zCk8jtY7

Ответ №1:

Это проблема в вашем коде pastebin:

 ip[strlen(ip)]='';
  

(Пытаюсь добавить нулевой ограничитель, но использую strlen, который сам зависит от наличия нулевого ограничителя).

Вот исправление:

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