#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 : «Содержимое вновь выделенного блока памяти не инициализируется, оставаясь с неопределенными значениями». Должен ли я указывать это по буквам?