Программа Socket server не ожидает клиента на этапе «accept» и выполняется в бесконечном цикле

#c #sockets #socketserver

#c #сокеты #socketserver

Вопрос:

Если я запускаю свою нижеприведенную программу сервера сокетов, она не ожидает подключения от клиента на этапе «accept», а начинает работать в бесконечном цикле. Моя программа сохранена как server.c, и я попытался запустить ее в командной строке с помощью приведенной ниже команды:

 $ ./server /tmp/socket
  

Полный код сервера сокетов:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>     



int server (int client_socket)
{
    while (1) {
        int length;
        char* text;             

        if (read (client_socket, amp;length, sizeof (length)) == 0) 
            return 0;

        text = (char*) malloc (length);

        read (client_socket, text, length);
        printf ("%sn", text);

        free (text);

        if (!strcmp (text, "quit"))
            return 1;
    }
}


int main (int argc, char* const argv[])
{
    const char* const socket_name = argv[1];                
    int socket_fd; 
    struct sockaddr_un name; 
    int client_sent_quit_message;           
    socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); 

    name.sun_family = AF_LOCAL; 
    strcpy (name.sun_path, socket_name); 
    bind (socket_fd, (struct sockaddr*)amp;name, SUN_LEN (amp;name)); 

    listen (socket_fd, 5); 

    do {
        struct sockaddr_un client_name;

        socklen_t client_name_len;
        int client_socket_fd;

        client_socket_fd = accept (socket_fd, amp;client_name, amp;client_name_len);
        client_sent_quit_message = server (client_socket_fd); 

        close (client_socket_fd);
      }
    while (!client_sent_quit_message);

    close (socket_fd);
    unlink (socket_name);
    return 0;
}   
  

Комментарии:

1. Why we need to write the below three lines? Знаете ли вы о какой-то базовой концепции C ? malloc и free являются базовой концепцией c . Освежите свой разум с помощью этой ссылки

2. Действительно легко понять malloc и free, но не могли бы вы объяснить, как на самом деле работают строки? @Jayesh

3. Если вам это легко понять, тогда просто используйте приведенную выше строку. вы должны иметь представление об этом.

4. @user3751012, выделяется ли память для конкретной строки кода text = (char*) malloc(length); ?

5. Если вы не проверяете коды ошибок, вам все равно, работает ли ваша программа правильно или нет.

Ответ №1:

Попробуйте следующий код:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>     
int server (int client_socket)
{
  while (1) {
    int length=30;
    char* text;             
    text = (char*) malloc (length);
    if (read (client_socket, text, length) == 0) 
        return 0;
    printf ("%sn", text);
    if (!strcmp (text, "quit"))
    {
        free(text);
        return 1;
    }
    free (text);
  }
}
int main (int argc, char* const argv[])
{ 
  const char* const socket_name = argv[1];                
  int socket_fd; 
  struct sockaddr_un name; 
  int client_sent_quit_message;           
  socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); 
  name.sun_family = AF_LOCAL; 
  strcpy (name.sun_path, socket_name); 
  bind (socket_fd, (struct sockaddr*)amp;name, SUN_LEN (amp;name)); 
  listen (socket_fd, 5); 
  do {
    struct sockaddr_un client_name;
    int client_name_len=sizeof(struct sockaddr_un);
    int client_socket_fd;
    client_socket_fd = accept (socket_fd,(struct sockaddr *)amp;client_name, amp;client_name_len);
    client_sent_quit_message = server (client_socket_fd); 
    close (client_socket_fd);
}
  while (!client_sent_quit_message);
  close (socket_fd);
  unlink (socket_name);
  return 0;
}
  

Ошибка заключается в том, что в функции accept вы не ввели приведение sockaddr_un к sockaddr * , тогда 3-й аргумент недействителен, мы не можем напрямую ввести приведение socklen_t к socklen_t * , вместо этого сохраните значение в integer и укажите указатель в качестве аргумента.

не используйте этот тип длины:
read (client_socket, amp;length, sizeof (длина));

Он считывает входные данные из сокета и пытается назначить в amp;length, затем вы пытаетесь сохранить значение в символьной переменной, в это время задается что-то пропущенное в соответствии с длиной или считывается длина.

Комментарии:

1. Существует использование after free для текста, server() скопированного из исходного кода.

2. Гм .. ‘printf («%s n», текст)’. malloc : «Содержимое вновь выделенного блока памяти не инициализируется, оставаясь с неопределенными значениями». Должен ли я указывать это по буквам?