tricityterminal Ответов: 1

Как мне закодировать struct sockaddr_in в правильный код из шаблона blueprint?


вот код справочного руководства для построения конечных точек адреса сокета
struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };


однако мне нужно закодировать этот стандартный чертеж; в программу со страницы linux
ip(7) - Страница руководства Linux[^]



Теперь я поделюсь своим кодом и расскажу о том, что было неправильно понято.

struct sockaddr_in clntsock
{
clntsock.sin_family = AF_INET
clntsock.sin_port = htons (9735)
clntsock.sin_addr = INADDR_ANY

}

первое, что я неправильно понял или неправильно закодировал, - это функция clntsock, указывающая на структуру, проходящую сборку через рулетку.

Какую информацию я должен поместить туда, чтобы заставить его работать "clntsock"?
может быть, я пропустил скобки или что-то в этом роде?
я stillg ошибка Эт отладчик ОД есть, что им хватает каких - { &ЛТ; ( indicatior или функция


Главным образом, почему в исходном шаблоне кода отсутствуют левые боковые структуры?
разве добавление "clntsock" восстанавливает их?
или как мне написать код с обоими, чтобы я мог полностью заполнить этот темпальт?

я просто не понимаю, почему я получаю синтаксические ошибки при написании этого простого структурного кода

что я должен сделать, чтобы заполнить эти куски, если я неправильно их кодирую?

Что я уже пробовал:

Я попробовал оба метода слева направо
но мне Нвер удалось их совместить
каким способом я могу их правильно закодировать?

1 Ответов

Рейтинг:
6

k5054

Во-первых, так и должно быть

clntsock.sin_addr.s_addr = hton(INADDR_ANY);


Вот функция, которая создаст сокет, который прослушивает соединения, чтобы вы могли работать:
int init_socket_on_port(unsigned short port)
{
    struct sockaddr_in serv_addr;
    const int one = 1;
    int sockfd;
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket()");
        return -1;
    }

    memset( &serv_addr, 0, sizeof serv_addr);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(port);
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);

    if( bind(sockfd, (struct sockaddr *) &serv_addr, sizeof serv_addr) < 0)
    {
        perror("bind");
        close(sockfd);
        return -1;
    }

    listen(sockfd, 1);
    printf("listening ... on socket \n");
    return sockfd;
}


Вы,вероятно, захотите изменить обработку ошибок, так как perror() возможно, это не совсем то, что нужно, и вам все равно придется позвонить accept() на возвращенной розетке.