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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2010, 21:01   #1
CsandeRR
 
Регистрация: 12.04.2010
Сообщений: 3
Восклицание Клиент-Сервер

Есть клиент, и есть сервер. Они работают всё нормально, но одна проблема препод просит чтоб было сразу несколько клиентов было... а у меня собственно только одни клиент одновременно может конектиться к серверу, как это исправить?

Сервер:
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")

void main(void) {
	char PCName [30], ClientName[30], Message[200];
	WSAData WSADat; // Свойства WinSock (результат функции WSAStartup)
	sockaddr_in sin; // Свойства(адрес) создаваемого сокета
	SOCKET Sock, Client; // Серверный и клиентский сокеты

	WSAStartup(0x0202,&WSADat); // Инициализация WinSock
								// 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2
								// WSADat - структура, куда будут занесены рез. инициализации
	gethostname(PCName, 30); // Получение имени текущего ПК

	sin.sin_family = AF_INET; // Тип адреса
	sin.sin_addr.s_addr = 0;  // IP-адрес сервера (пори создании сервера можно 0)
	sin.sin_port = htons(2803); // Номер порта сервера
	Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Создание сокета
	bind(Sock, (sockaddr*)&sin, sizeof(sin)); // Связывание созданного сокета с адресом sin

	// ***** Ожиданеи клиента
	printf("Wait of client...\n");
	
	listen(Sock, SOMAXCONN); // Прослушивание сокета сервером (для подключения клиента)
	Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента
	recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента
	send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера)

	printf("Client ( \"%s\" ) has connected!\n", ClientName);

	// ***** Меню
	int Menu;
	do {
		printf("1. Send message;\n");
		printf("2. Get Message;\n");
		printf("3. Quit;\n");

		printf("Make your selection: ");
		scanf_s("%i", &Menu);

		switch (Menu) {
		case 1:
			// Отправка сообщения клиенту
			printf("Enter message: ");
			scanf_s("%199s", Message, 200);
			if (send(Client, Message, strlen(Message) + 1, 0) != SOCKET_ERROR)printf("Sent!\n");
			else printf("Error of sending!\n");
		break;
		case 2:
			// Приём сообщения от клиента
			if (recv(Client, Message, 200, 0) != SOCKET_ERROR) { 
				printf("%s\n", Message);
				_gettch();
			}
			else printf("Error of getting!\n");
		break;
		};

		printf("\n");
	} while (Menu != 3);

	// Закрытие сокетов и окончание работы с WinSock
	closesocket(Sock);
	closesocket(Client);
	WSACleanup();
	_gettch();
}
Клиент:
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")

void main(void) {
	char PCName[30], ServerName[30], Message[200], IP[16] = { 0 };
	WSAData WSADat; // Свойства WinSock (результат функции WSAStartup)
	sockaddr_in sin; // Свойства(адрес) создаваемого сокета
	SOCKET Sock; // Клиентский сокет

	// Ввод IP-адреса сервера
	printf("Enter server's IP: ");
	scanf_s("%15s", IP, 16);

	WSAStartup(0x0202, &WSADat); // Инициализация WinSock
								 // 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2
								 // WSADat - структура, куда будут занесены рез. инициализации
	gethostname(PCName, 30); // Получение имени текущего ПК

	sin.sin_family = AF_INET; // Тип адреса
	sin.sin_addr.s_addr = inet_addr(IP); // IP-адрес сервера (пори создании сервера можно 0)
	sin.sin_port = htons(2803); // Номер порта сервера

	Sock = socket(AF_INET, SOCK_STREAM, 0); // Создание сокета

	// ***** Подключение к серверу
	printf("Connecting to server...\n");

	if (connect(Sock, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) {
		printf("Connection error!\n");
		goto End;
	}
	send(Sock, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (клиента)
	recv(Sock, ServerName, 30, 0); // Получение имени компьютера сервера

	printf("Connected to \"%s\"!\n", ServerName);

	// ***** Меню
	int Menu;
	do {
		printf("1. Send message;\n");
		printf("2. Get Message;\n");
		printf("3. Quit;\n");

		printf("Make your selection: ");
		scanf_s("%i", &Menu);

		switch (Menu) {
		case 1:
			// Отправка сообщения серверу
			printf("Enter message: ");
			scanf_s("%199s", Message, 200);
			if (send(Sock, Message, strlen(Message) + 1, 0) != SOCKET_ERROR) printf("Sent!\n");
			else printf("Error of sending!\n");
		break;
		case 2:
			// Приём сообщения от сервера
			if (recv(Sock, Message, 200, 0) != SOCKET_ERROR) {
				printf("%s\n", Message);
				_gettch();
			}
			else printf("Error of getting!\n");
		break;
		};

		printf("\n");
	} while (Menu != 3);

End:

	// Закрытие сокетов и окончание работы с WinSock
	closesocket(Sock);
	WSACleanup();
	_gettch();
}
Заранее благодарен.
CsandeRR вне форума Ответить с цитированием
Старый 17.05.2010, 00:28   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

В разных потоках ждать подключения.
Carbon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
клиент сервер dampirik C/C++ Сетевое программирование 15 23.10.2009 09:33
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57