Я пытаюсь создать простую серверную программу через C, но я не хочу, чтобы она использовала мой текущий IP, скорее я хочу предоставить конкретный IP.Но все не работает.
В качестве самого первого шага по предоставлению конкретного IP-адреса я удалил из кода следующее утверждение: [ПРИМЕЧАНИЕ]: Здесь 'hints' - это объект struct addrinfo
* 1004.*
hints.ai_flags = AI_PASSIVE;
Это потому, что он автоматически заполняет наш IP, не позволяя нам указать конкретный IP.
Затем я попытался использовать inet_pton()
, чтобы предоставить конкретный IP для sin_addr
(memberструктуры sockaddr_in
) с использованием инструкции:
inet_pton(AF_INET , host_to_connect , &(((struct sockaddr_in *)hints.ai_addr)->sin_addr));
Здесь 'host_to_connect' - это строка, содержащая требуемый IP-адрес в десятичном формате с точками (например, char * host_to_connect = "192.168.22.23")
Поскольку в структуре sockaddr
нет члена с именем sin_addr
, я типизировал его в структуру sockaddr_in
, а затем получил доступ к sin_addr
.
Вот фактический код, в котором я работаюon:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netdb.h>
#include<arpa/inet.h>
int main(int argc , char **argv)
{
char *host_to_connect = argv[1];
char *port = argv[2];
struct addrinfo hints , *server_info;
memset(&hints , 0 , sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
inet_pton(AF_INET , host_to_connect , &(((struct sockaddr_in *)hints.ai_addr)->sin_addr));
//hints.ai_flags = AI_PASSIVE;
int status;
if((status = getaddrinfo(NULL , port , &hints, &server_info)) != 0)
{
fprintf(stderr , "Error in getaddrinfo(): %s\n" , gai_strerror(status));
return 2;
}
//creating a socket
int socketfd;
if((socketfd = socket(server_info->ai_family , server_info->ai_socktype , server_info->ai_protocol)) == -1)
{
fprintf(stderr , "Error in socket() : %s\n " , gai_strerror(socketfd));
return 2;
}
//binding port to socket
int bind_status;
if((bind_status = bind(socketfd , server_info->ai_addr , server_info->ai_addrlen)) == -1)
{
fprintf(stderr , "Error in bind() : %s\n " , gai_strerror(bind_status));
return 2;
}
//listining on the socket
int listen_status;
if((listen_status = listen(socketfd , 5)) == -1 )
{
fprintf(stderr , "Error in listen() : %s\n " , gai_strerror(listen_status));
return 2;
}
//accepting connections
int client_fd;
struct sockaddr_storage client_info;
socklen_t address_length = sizeof(client_info);
if((client_fd = accept(socketfd , (struct sockaddr *)&client_info , &address_length)) == -1)
{
fprintf(stderr , "Error in accept() : %s\n " , gai_strerror(client_fd));
return 2;
}
//sending message to client
char *message = "\n\nYou are successfully connected to the server!\n\n";
int bytes_sent;
bytes_sent = send(client_fd , message , strlen(message) , 0);
printf("\nBytes sent: %d\n" , bytes_sent);
close(socketfd);
return 0;
}
Я ожидал, что он будет работать хорошо, но когда я запускаю его, предоставляя необходимые аргументы, такие как:
gcc server.c -o ./server
./server "192.168.22.23" "8989"
Я получаю Ошибка сегментации каквыход.
Когда я пытаюсь отладить его с помощью отладчика GNU, выясняется, что что-то не так с inet_pton()
, использованным в коде, но я не могу понять это.
Буду рад, если кто-то сможет все прояснить!