Я пытаюсь создать клиент-серверную игру в крестики-нолики в качестве домашней работы.Я настраиваю сервер-слушатель и соединения в отдельных функциях, а не в основной программе.Создание сокета сервера прошло успешно, но клиентские соединения не работают, что, по-моему, и является причиной сбоя seg.
Я уже искал подобные проблемы и как можно лучше вносил изменения в мой код,как установка переменной для sizeof (cli_addr) вместо прямой передачи в accept ().Я не знаю, почему он не работает.
Это функция, которая устанавливает соединения
void setup_connections(int serversocket,int *clientsocket,int portnum){
int cli_size,con_num = 0;
struct sockaddr_in cli_addr;
//server is listening for clients
listen(serversocket,5);
while(con_num<2){
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(portnum);
//accept connection while creating client socket
cli_size = sizeof(cli_addr);
clientsocket[con_num] = accept(serversocket,(struct sockaddr *) &cli_addr,cli_size);
if(clientsocket[con_num]<0){
perror("Error: ");
}
con_num++;
}
}
При компиляции о типе cli_size я получаю предупреждение.
* предупреждение: несовместимое преобразование целочисленного значения в указатель, передающее 'int' параметру типа 'socklen_t *' (также известный как unsigned int * ') [-Wint-преобразование] clientsocket [con_num] = accept (serversocket, (struct sockaddr *)1011 *) & cli_addr, cli_size);
Однако все проверенные мной примеры передаются следующим образом.
Это функция, которая устанавливает сокет сервера.
int setup_server(int portnum){
int serversocket,serv_bind;
struct sockaddr_in server_addr;
serversocket = socket(AF_INET, SOCK_STREAM, 0);
if(serversocket<0){
printf("Failed to create server\n");
}
//set up server info
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(portnum); //port number given by user
//link server address to socket
serv_bind = bind(serversocket,(struct sockaddr *) &server_addr,sizeof(server_addr));
if(serv_bind<0){
printf("Failed to bind\n");
}
return serversocket;
}
И это код в main.c, который их вызывает:
int portnum,serversocket, clientsocket[2]; //sockets
portnum = atoi(argv[1]);
if(argc < 2){
printf("Port number not given");
}
//create sockets
serversocket = setup_server(portnum);
setup_connections(serversocket,clientsocket);
Что я получаю после запуска программы:
Ошибка:: Плохой адрес
Ошибка:: Плохой адрес
Ошибка сегментации: 11
Если вы можете объяснить мне, что я делаю неправильно, это было бы очень полезно.