Здравствуйте! Помогите,пожалуйста,доработать Клиент-Сервер.Никак не получается... Завтра последний день сдачи Условия выполнения: «Задание: разработать приложение-клиент и приложение сервер, обеспечивающие функции мгновенного обмена сообщений между пользователями.
Основные возможности. Серверное приложение должно реализовывать следующие функции: 1) Прослушивание определенного порта 2) Обработка запросов на подключение по этому порту от клиентов 3) Поддержка одновременной работы нескольких клиентов через механизм нитей 4) Передача текстового сообщения одному клиенту 5) Передача текстового сообщения всем клиентам 6) Прием и ретрансляция входящих сообщений от клиентов 7) Обработка запроса на отключение клиента 8) Принудительное отключение указанного клиента
Клиентское приложение должно реализовывать следующие функции: 1) Установление соединения с сервером 2) Передача сообщения всем клиентам 3) Передача сообщения указанному клиенту 4) Прием сообщения от сервера с последующей индикацией 5) Разрыв соединения 6) Обработка ситуации отключения клиента сервером
Настройки приложений. Разработанное клиентское приложение должно предоставлять пользователю настройку IP-адреса или доменного имени сервера сообщений и номера порта сервера. »
Пока в работе у меня выполнено следующие условия:Сервер:1,2,3 ;Клиент:1,. В данном случае у меня клиент отправляет сообщение серверу,а сервер отправляет этоже сообщение обратно клиенту.
Код Сервера:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int sock, listener; // дескрипторы сокетов
struct sockaddr_in addr; // структура с адресом
char buf[2048]; // буфур для приема
int bytes_read; // кол-во принятых байт
listener = socket(AF_INET, SOCK_STREAM, 0); // создаем сокет для входных подключений
if(listener < 0)
{
perror("socket");
exit(1);
}
// Указываем параметры сервера
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
//addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) // связываемся с сетевым устройство. Сейчас это устройство lo - "петля", которое используется для отладки сетевых приложений
{
perror("bind");
exit(2);
}
listen(listener, 1); // очередь входных подключений
while(1)
{
sock = accept(listener, NULL, NULL); // принимаем входные подключение и создаем отделный сокет для каждого нового подключившегося клиента
if(sock < 0)
{
perror("Прием входящих подключений");
exit(3);
}
switch(fork())
{
case -1:
perror("fork");
break;
case 0:
close(listener);
while(1)
{
printf("Ожидаем сообщение...\n");
bytes_read = recv(sock, buf, 2048, 0); // принимаем сообщение от клиента
if(bytes_read <= 0) break;
printf("Получено %d bytes\tСообщение: %s\n", bytes_read, buf);
printf("Отправляю принятое сообщение клиенту\n");
send(sock, buf, bytes_read, 0); // отправляем принятое сообщение клиенту
}
close(sock); // закрываем сокет
_exit(0);
default:
close(sock);
}
}
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char message[2048];//=(char*)malloc(sizeof(char));// сообщение на передачу
char buf[sizeof(message)];
int port,ch;
//----------------------------------------------------------------------------
if(argc!=3){
printf("Не верное кол-во аргументов!\nДолжно быть 2 аргумента (Порт,ip-адрес -сервера)!\n");
exit(0);
}
int sock; // дескриптор сокета
struct sockaddr_in addr; // структура с адресом
struct hostent* hostinfo;
port = atoi(argv[1]);
hostinfo = argv[2];
sock = socket(AF_INET, SOCK_STREAM, 0); // создание TCP-сокета
if(sock < 0)
{
perror("socket");
exit(1);
}
// Указываем параметры сервера
addr.sin_family = AF_INET; // домены Internet
addr.sin_port = htons(port); // или любой другой порт...
addr.sin_addr.s_addr=inet_addr(hostinfo);
/*
* Начинающие программисты часто спрашивают, как можно отлаживать сетевую программу, если под рукой нет сети.
* Оказывается, можно обойтись и без неё. Достаточно запустить клиента и сервера на одной машине, а затем использовать для соединения адрес интерфейса внутренней петли (loopback interface).
* В программе ему соответствует константа INADDR_LOOPBACK (не забудьте применять к ней функцию htonl!).
* Пакеты, направляемые по этому адресу, в сеть не попадают.
* Вместо этого они передаются стеку протоколов TCP/IP как только что принятые.
* Таким образом моделируется наличие виртуальной сети, в которой вы можете отлаживать ваши сетевые приложения.
*/
// addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
//addr.sin_addr.s_addr = inet_addr(host_ip);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) // установка соединения с сервером
{
perror("Подключение");
exit(2);
}
while(1){//WHILE <---
//----------------------------------------------------------------------------
printf("Введите сообщение серверу(Для выхода:exit): ");
if (!strcmp(gets(message), "exit")){close(sock);return 0;}
//----------------------------------------------------------------------------
printf("отправка сообщения на сервер...\n");
send(sock, message, sizeof(message), 0); // отправка сообщения на сервер
int bytes_read = 0;
printf("Ожидание сообщения\n");
bytes_read = recv(sock, buf, sizeof(message), 0);
printf("Получено %d bytes\tСообщение: %s\n", bytes_read, buf); // прием сообщения от сервера
}//END_WHILE
return 0;
}