Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2011, 18:02   #1
zhenya.ya
Форумчанин
 
Регистрация: 29.11.2009
Сообщений: 142
Сообщение TCP/IP клиент -сервер

Проблема: мне нужно зациклить так, чтобы сервер работал не с одним клиентом, а со многими. Что я сделал не так?

сервер:

Код:
void main()
 {
	 WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested=MAKEWORD(2,2);
	WSAStartup(wVersionRequested,&wsaData);

SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(80);
	sin.sin_addr.s_addr = INADDR_ANY;

	 int err = bind( s, (LPSOCKADDR)&sin, sizeof(sin) );
	 err = listen( s, SOMAXCONN);

for(;;)
{	
		 char str[22];
    sockaddr_in from;
	int fromlen=sizeof(from);
	SOCKET  s1 = accept(s,(struct sockaddr*)&from, &fromlen);

  err = recv(s1, str, sizeof(str), 0 ); 
  cout<<str<<endl;
 err = send( s1, "Yes!", 5, 0 ); 
 closesocket(s1);
	}
	 	WSACleanup();
system("pause");
 }
клиент:

Код:
int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested=MAKEWORD(2,2);
	WSAStartup(wVersionRequested,&wsaData);

int rc;
SOCKET s1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
        struct sockaddr_in anAddr;
        anAddr.sin_family = AF_INET;
        anAddr.sin_port = htons(80);
        anAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
        connect(s1, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));

		for(;;)
		{
		char str[22];
	cout<<"\n input str:"<<endl;
	cin>>str;

		      rc = send( s1, str,sizeof(str), 0 ); 
			  rc = recv(s1,str, sizeof(str), 0 ) ; 
			  cout<<str;
		}
	 closesocket(s1);
			  	WSACleanup();
                system("pause");
                return 0;
}
zhenya.ya вне форума Ответить с цитированием
Старый 05.03.2011, 18:52   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Сервер и так работает со многими клиентами, просто не одновременно, т.к. у вас клиентское соединение закрывается сразу же после получения первой порции данных. Создавайте для каждого нового клиента поток, в котором будет крутиться этот код:

Код:
 err = recv(s1, str, sizeof(str), 0 ); 
  cout<<str<<endl;
 err = send( s1, "Yes!", 5, 0 );
до тех пор, пока общение с клиентом имеет смысл.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 05.03.2011 в 18:54.
veniside вне форума Ответить с цитированием
Старый 05.03.2011, 18:58   #3
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

del
To delete
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 05.03.2011, 19:01   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Так, как у ТС сейчас написано, цикл будет тупо висеть внутри акцепт(), в ожидании новых клиентов. Можно и без потоков, но тогда перед каждым блокирующим вызовом нужен как минимум select().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.03.2011, 19:15   #5
zhenya.ya
Форумчанин
 
Регистрация: 29.11.2009
Сообщений: 142
По умолчанию

Цитата:
цикл будет тупо висеть внутри акцепт(), в ожидании новых клиентов
А разьве так не должно быть? Я думаю должно быть так: отработал сервер с одним клиентом и все, теперь может с другим и так должен мочь работать до бесконечности.
zhenya.ya вне форума Ответить с цитированием
Старый 05.03.2011, 19:29   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

В коде первого поста все не верно. Для работы со многими клиентами одновременно нужно использовать асинхронный режим сокетов. Почитай книгу М.Е.Фленова "C++ глазами хакера". Там это есть.
profi вне форума Ответить с цитированием
Старый 05.03.2011, 19:30   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> разьве так не должно быть?

От задачи зависит. Для веб-сервера, например, это будет не очень удачное решение.

> теперь может с другим и так должен мочь работать до бесконечности

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

Цитата:
Для работы со многими клиентами одновременно нужно использовать асинхронный режим сокетов
не обязательно, хотя такой подход лучше масштабируется.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 05.03.2011 в 19:33.
veniside вне форума Ответить с цитированием
Старый 05.03.2011, 20:12   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

veniside ну тебе виднее .
profi вне форума Ответить с цитированием
Старый 05.03.2011, 21:18   #9
zhenya.ya
Форумчанин
 
Регистрация: 29.11.2009
Сообщений: 142
По умолчанию

Короче, как я понял, в моем варианте возможно работа со многими клиентами, если не одновременно?
Хм... мне просто сказал преподаватель, что вот так, как в моем примере, нужно зациклить.... таким образом типа правильно... удавлетворяет работе с клиентами, если они не одновременно?
zhenya.ya вне форума Ответить с цитированием
Старый 05.03.2011, 21:43   #10
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Если не одновременно, то да. Все правильно с кодом.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
простой сервер(клиент) TCP nntpaha Общие вопросы C/C++ 4 25.12.2007 19:02