Не получается привязать сокет к порту в Си
Не получается привязать сокет к порту на Си, пишет:
Bind socket failed: Socket operation on non-socket
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 6000
int server_socket;
void create_socket() {
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}
}
void create_struct() {
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Bind socket failed");
close(server_socket);
exit(EXIT_FAILURE);
}
if (listen(server_socket, 10) < 0) {
perror("Listen failed");
close(server_socket);
exit(EXIT_FAILURE);
}
printf("Server started on the port: %d", PORT);
while(1) {
struct sockaddr_in client_addr;
socklen_t client_length = sizeof(client_addr);
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_length);
if (client_socket < 0) {
perror("Accept failed");
continue;
}
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
printf("Connect from: %s", client_ip);
close(client_socket);
}
}
int main() {
create_socket();
create_struct();
return 0;
}
Ответы (1 шт):
Автор решения: citn
→ Ссылка
Вы объявляете переменную server_socket
как локальную внутри функции create_socket()
и она не влияет на глобальную переменную с тем же именем. Стоит просто убрать int
.
int server_socket; // Глобальная переменная
void create_socket() {
server_socket = socket(AF_INET, SOCK_STREAM, 0); // Убираем 'int' перед server_socket
if (server_socket < 0) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}
}