Функция Accept ();Простой TCP-сервер в C - PullRequest
2 голосов
/ 24 июля 2010

Я изучаю программирование сокетов в C и скачал простой исходный файл tcp сервера.Я понимаю каждую строку, кроме 2-х параметров в этих функциях:

accept(socket_fd, (struct sockaddr *)&client, &length);

bind(socket_fd, (struct sockaddr *)&server, length);

Функции accept + bind - это типичные функции в "sys / types.h" & "sys / socket.h" и manСтраница описывает это как указатель на структуру, но я все еще не могу понять, что здесь на самом деле происходит.

Может кто-нибудь объяснить, что происходит во втором параметре?Скобки, указатель и символы адреса смущают меня в одном выражении.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 24 июля 2010

Символ & по существу означает «получить адрес значения / объекта». (struct sockaddr *) - это актерский состав. Он сообщает компилятору, что вы хотите обрабатывать адрес как указатель на структуру sockaddr. Итак, вместе это говорит компилятору, что client может рассматриваться как структура sockaddr и передавать его адрес функции. В случае функции accept адрес соединительного разъема будет сохранен в заданной структуре.

2 голосов
/ 24 июля 2010

Происходит следующее: функции accept и bind ожидают указателей struct sockaddr, а ваши переменные client и server, вероятно, объявлены как (struct sockaddr *). Итак, чтобы избежать предупреждения в C или ошибки компилятора в C ++ , вам нужно явное приведение, которое вы делаете, помещая выражение:

(struct sockaddr *)

Перед вашим параметром.

А вам нужен амперсанд, потому что client и server не указатели. Они, вероятно, были объявлены как:

struct sockaddr_in client, server;
0 голосов
/ 24 июля 2010

Стоит также упомянуть, что структуры тесно связаны.Взгляните на картинку от Стивенса UnP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...