Я создал клиент-серверную программу, использующую программирование сокетов C, и ее запуск отлично работает на моей ОС Ubuntu, которая работает на VMware. Единственная проблема, с которой я столкнулся, - это вызов API-интерфейса listen.Ограничение максимального количества подключений к серверу не работает
Хотя я установил лимит подключения на 2, я могу открыть четыре терминала и одновременно подключиться к серверу.
listen (serverFd, 2); /* Maximum pending connection length */
Клиент и сервер работают на одном компьютере.
Это фрагмент кода
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* for sockaddr_un struct */
#define DEFAULT_PROTOCOL 0
#define BUFFER_SIZE 1024
/* POSIX renames "Unix domain" as "local IPC."
Not all systems define AF_LOCAL and PF_LOCAL (yet). */
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
/****************************************************************/
main()
{
printf("Hello, server is starting...\n");
// initialize data from text file into system
readData();
printf("Country data loaded with total of %i countries available.\n", NoOfRecordsRead);
if(NoOfRecordsRead == 0)
{
printf("No valid data to serve, terminating application...\n");
exit (-1);
}
int serverFd, clientFd, serverLen, clientLen;
struct sockaddr_un serverAddress;/* Server address */
struct sockaddr_un clientAddress; /* Client address */
struct sockaddr* serverSockAddrPtr; /* Ptr to server address */
struct sockaddr* clientSockAddrPtr; /* Ptr to client address */
/* Ignore death-of-child signals to prevent zombies */
signal (SIGCHLD, SIG_IGN);
serverSockAddrPtr = (struct sockaddr*) &serverAddress;
serverLen = sizeof (serverAddress);
clientSockAddrPtr = (struct sockaddr*) &clientAddress;
clientLen = sizeof (clientAddress);
/* Create a socket, bidirectional, default protocol */
serverFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
serverAddress.sun_family = AF_LOCAL; /* Set domain type */
strcpy (serverAddress.sun_path, "country"); /* Set name */
unlink ("country"); /* Remove file if it already exists */
bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */
listen (serverFd, 2); /* Maximum pending connection length */
printf("Server started.\n");
while (1) /* Loop forever */
{
/* Accept a client connection */
clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);
if (fork() == 0) /* Create child to send recipe */
{
//do something
}
}
}
Почему это происходит
+1 И платформа может тихо регулировать значение отставания вниз или чаще всего вверх. – EJP