#c #sockets #serversocket
#c #сокеты #serversocket
Вопрос:
Я создаю сокет клиент / сервер, и мне нужно получить IP-адрес сервера сокетов, используя функцию sockaddr_in getsocketname() . Однако я не уверен, как это сделать, поскольку я не могу сделать что-то вроде
struct sockaddr_in servAddr;
int IP = servAddr.getsockname(sock, (struct sockaddr *) %servAddr,sizeof(servAddr));
Комментарии:
1. Возможно, вы могли бы добавить некоторые детали, например, какая ОС и компилятор задействованы? Кроме того, было бы полезно, если бы предоставленный код был более полным; например, компилируемая программа включает main() и т. Д.
2. В C у структур не может быть методов-членов. Функции нет
getsocketname()
. Вы имеете в видуgetsockname()
?
Ответ №1:
Я считаю, что getsockname() используется на стороне клиента, а не сервера, и только после успешного установления соединения с использованием сокета с определенным вами сервером.
Чтобы объяснить, возможный поток для подключения клиента к серверу:
- Создайте переменную socketfd, например, ‘sock’ в вашем случае
- Откройте переменную socketfd с помощью вызова socket(…)
- Создайте свою собственную переменную для хранения сведений о сервере, скажем:
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("0.0.0.0"); // replace with actual server IP
serverAddr.sin_port = htons(80); // replace with actual port
- Подключите sockfd к серверу, указанному с помощью serverAddr, используя вызов connect(…)
- Получите IP-адрес и порт на стороне клиента для этого соединения, используя вызов getsockname(…)
getsockname(socketfd, (struct sockaddr *) amp;clientAddr, sizeof(clientAddr));
char buffer[INET_ADDRSTRLEN]; // stores the client side IP address
inet_ntop(AF_INET, amp;clientAddr.sin_addr, buffer, sizeof(buffer));
int port = (int) ntohs(clientAddr.sin_port); // stores the client side port
printf("IP address: %sn", buffer);
printf("Port: %dn", port);