URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 84199
[ Назад ]

Исходное сообщение
"Сокеты C++ UNIX"

Отправлено Максим , 20-Фев-09 18:55 
Всем привет!
Ребята, нужна помощь.
Гуглил, гуглил... ничего не на гуглил(((

Ниже приведен исходник эхо сервера:

eservd.cpp


int SERVER_SOCKET;
int CLIENT_SOCKET;
struct sockaddr_in SERVER_ADDR;
struct sockaddr_in CLIENT_ADDR;
char i_buffer[1024];
socklen_t CLIENT_ADDR_SIZE = sizeof(CLIENT_ADDR);

using namespace std;

int main ()
{
   bzero(&SERVER_ADDR, sizeof(SERVER_ADDR));
   SERVER_SOCKET = socket(AF_INET, SOCK_STREAM, 0);
   bind(SERVER_SOCKET, (struct sockaddr *)&SERVER_ADDR, sizeof(SERVER_ADDR));
   listen(SERVER_SOCKET, SERVER_MAX_CONN);

   for(;;)
   {
      CLIENT_SOCKET = accept(SERVER_SOCKET, (struct sockaddr *)&CLIENT_ADDR, &CLIENT_ADDR_SIZE);

      if(fork() == 0)
      {
         for(;;)
         {
            if(recv(CLIENT_SOCKET, &i_buffer, sizeof(i_buffer), 0) == 0) return 0;
            send(CLIENT_SOCKET, i_buffer, sizeof(i_buffer), 0);
         }
      }

      close (CLIENT_SOCKET);
   }

   close (SERVER_SOCKET);
   return 0;
}

Как все понимают, эта программа принимает строку от клиента и отражает ее обратно.

Цель:
Сервер должен отражать принятую строку не только тому клиенту который ее послал, а всем подключенным клиентам в этот момент времени.

Вопросы:
1. Как узнать число подключенных клиентов к серверу?
2. Как отправлять данные конкретно какому-либо клиенту подключенному к серверу.

Думаю, что ответы на поставленные мной вопросы решат поставленную мною задачу.
Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Сокеты C++ UNIX"
Отправлено злобый анонимус , 20-Фев-09 20:19 
1. Где тут C++?
2. А куда собственно он bind-ится?
3. Этот код не компилируется, так и задумано?

"Сокеты C++ UNIX"
Отправлено Максим , 20-Фев-09 20:44 
>1. Где тут C++?

Что значит "Где тут C++?" ?!?!??! хм...

>2. А куда собственно он bind-ится?

Клиенты на винде, тока какое это имеет значение?

>3. Этот код не компилируется, так и задумано?

Все работает нормально. Внимательнее плз.



"Сокеты C++ UNIX"
Отправлено Максим , 21-Фев-09 23:47 
В коде сервера были небольшие ошибки (с fork напутал немного), вот исправленный вариант:


#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int SERVER_SOCKET;
int CLIENT_SOCKET;
struct sockaddr_in SERVER_ADDR;
struct sockaddr_in CLIENT_ADDR;
char i_buffer[1024];
socklen_t CLIENT_ADDR_SIZE = sizeof(CLIENT_ADDR);
using namespace std;

int main ()
{
   bzero(&SERVER_ADDR, sizeof(SERVER_ADDR));
   SERVER_SOCKET = socket(AF_INET, SOCK_STREAM, 0);
   bind(SERVER_SOCKET, (struct sockaddr *)&SERVER_ADDR, sizeof(SERVER_ADDR));
   listen(SERVER_SOCKET, SERVER_MAX_CONN);

   for(;;)
   {
      CLIENT_SOCKET = accept(SERVER_SOCKET, (struct sockaddr *)&CLIENT_ADDR, &CLIENT_ADDR_SIZE);

      if(fork() == 0)
      {
         close (SERVER_SOCKET);

         for(;;)
         {
            if(recv(CLIENT_SOCKET, &i_buffer, sizeof(i_buffer), 0) == 0) return 0;
            send(CLIENT_SOCKET, i_buffer, sizeof(i_buffer), 0);
         }

         exit(0);
      }

      close (CLIENT_SOCKET);
   }

   return 0;
}



"Сокеты C++ UNIX"
Отправлено fa , 24-Фев-09 01:46 
Использовать select вместо форканья?