The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Сокеты C++ UNIX"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [ Отслеживать ]

"Сокеты C++ UNIX"  
Сообщение от Максим (??) on 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ообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

2. "Сокеты C++ UNIX"  
Сообщение от Максим (??) on 20-Фев-09, 20:44 
>1. Где тут C++?

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

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

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

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Сокеты C++ UNIX"  
Сообщение от Максим (??) on 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ообщить модератору

4. "Сокеты C++ UNIX"  
Сообщение от fa email(??) on 24-Фев-09, 01:46 
Использовать select вместо форканья?


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру