Как связать адрес в программировании сокетов в c / c ++? - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу связать адрес «95.96.10.1» с номером порта 8080. Но когда я попробовал приведенный ниже код, он выдал ошибку «адрес уже используется».

#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
int main(int argc, char const *argv[]) 
{ 
int server_fd, new_socket, valread; 
struct sockaddr_in address; 
int opt = 1; 
int addrlen = sizeof(address); 
char buffer[1024] = {0}; 
char *hello = "Hello from server"; 

// Creating socket file descriptor 
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
{ 
    perror("socket failed"); 
    exit(EXIT_FAILURE); 
} 


if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, 
                                              &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = INADDR_ANY; 
address.sin_port = htons( PORT ); 

// Forcefully attaching socket to the port 8080 
if (bind(server_fd, (struct sockaddr *)&address,  
                             sizeof(address))<0) 
{ 
    perror("bind failed"); 
    exit(EXIT_FAILURE); 
} 

Пожалуйста, дайте мне знать, как связать адрес с портом?

1 Ответ

1 голос
/ 24 апреля 2020

В настоящее время вы привязываетесь к INADDR_ANY, что означает привязку ко всем интерфейсам:

address.sin_addr.s_addr = INADDR_ANY; 

Если вы хотите привязать к указанному c адресу, вам необходимо установить его. Вы можете использовать функцию inet_addr для преобразования строки IPv4 в значение адреса:

address.sin_addr.s_addr = inet_addr("95.96.10.1"); 

Кроме того, параметры сокета не могут быть объединены ИЛИ. Вы можете работать только по одному за раз.

if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...