Всем привет!
Ребята, нужна помощь.
Гуглил, гуглил... ничего не на гуглил(((Ниже приведен исходник эхо сервера:
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. Как отправлять данные конкретно какому-либо клиенту подключенному к серверу.Думаю, что ответы на поставленные мной вопросы решат поставленную мною задачу.
Заранее спасибо.
1. Где тут C++?
2. А куда собственно он bind-ится?
3. Этот код не компилируется, так и задумано?
>1. Где тут C++?Что значит "Где тут C++?" ?!?!??! хм...
>2. А куда собственно он bind-ится?
Клиенты на винде, тока какое это имеет значение?
>3. Этот код не компилируется, так и задумано?
Все работает нормально. Внимательнее плз.
В коде сервера были небольшие ошибки (с 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;
}
Использовать select вместо форканья?