Программирование на сокете, 2 клиентских запроса одновременно - PullRequest
1 голос
/ 09 августа 2010

Как мой клиент может отправить два запроса (в двух разных терминалах) на сервер одновременно?Когда я пытаюсь это сделать, только один работает, другой закрывает сокет.

main  ()
  {

    readData ();
    int serverFd, clientFd, clientFd2,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, "countries"); /* Set name */
    unlink ("countries"); /* Remove file if it already exists */
    bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */
    listen (serverFd, 5); /* Maximum pending connection length */

    while (1) /* Loop forever */
      {
        /* Accept a client connection */
        clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);


        while (fork () == 0) /* Create child to send recipe */
          {
int recvquery;
char countrynamereceivedquery[200];
while (recvquery=read(clientFd,countrynamereceivedquery,sizeof(countrynamereceivedquery)))
{
//print results

}
}

Это моя серверная программа.Я запускаю его как фоновый процесс, а затем запускаю клиентскую программу, которая может искать текстовый файл, хранящийся в массиве на сервере.Прямо сейчас, когда я открываю два терминала и запускаю клиент одновременно, один клиент выходит из программы, а другой клиент получает запрос jus-quit-client и ищет сервер.Я создал два сокета, но клиент просто завершил работу в обоих терминалах.

Ответы [ 2 ]

0 голосов
/ 09 августа 2010
  1. Вы используете функциональный разъем () для создать сокет TCP.

  2. Вы назначаете номер порта с помощью bind () для сокета.

  3. С помощью listen () система разрешает соединения с этим портом.

  4. Повторите следующее:

    а. accept () получает новый сокет для каждого подключенного клиента.

    б. С send () и recv () вы общаетесь с клиентом через этот новый сокет.

    с. Наконец вы закрываете клиентское соединение с помощью функции close ().

0 голосов
/ 09 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...