Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8740
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2920
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2562
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1696
Дата выхода:13.11.2011, 19:00
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:281 / 163
Вопросов / ответов:1 / 1

Консультация # 184407: Здравствуйте! Прошу помощи в следующем вопросе: это серерное приложение.приложение будет принимать подключение на определенном порту как только придет некоторый пакет будет вызыватся функция выполняющая некоторые дей ствия с полученными данными после чего приложение завершается. приложение довести до рабочего, чем компилить,на каком порту...


Консультация # 184407:

Здравствуйте! Прошу помощи в следующем вопросе:
это серерное приложение.приложение будет принимать подключение на определенном порту
как только придет некоторый пакет будет вызыватся функция выполняющая некоторые дей ствия с полученными данными после чего приложение завершается.
приложение довести до рабочего, чем компилить,на каком порту подключение,в общем
объясните пожалуйста еще раз именно это приложение
спасибо

Дата отправки: 08.11.2011, 18:19
Вопрос задал: storosh (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, storosh!
Смотрите, изучайте.
Будут вопросы, задавайте в мини-форуме.

Программа может быть скомпилирована в любой студии от Microsoft

Код :
#include <winsock2.h>
#include <string.h>
#include <stdio.h>

#pragma comment (lib,"ws2_32.lib")	//для работы с сокетами нужна эта dll

#define	PORT	4050				//пусть будет номер порта, на котором сервер будет слушать
#define	MAXCON	10					//максимальное количество одновременных подключений

void pr(char *to, char *from)
{
	strcpy(to, from);				//копируем без всяких проверок. Срыв стека неизбежен
}

int main(int argc,char **argv)
{
	SOCKET		listen_socket,		//слушаюший сокет
				accept_socket;		//сокет для соединения c клиентом
	SOCKADDR_IN	listen_addr,		//структура, описывающая локальный адрес сервера
				accept_addr;		//адрес клиента, с которым установлено соединение
	int			accepted_len = sizeof(accept_addr); //длина
	WSADATA		wsaData;			//данные для инициализации WinSock
	char		Message[5000]= "";	//сюда примем строку от клиента
	char		buf[50]="";			//а сюда перепишем, без проверки переполнения

	// Инициализация WINSOCK, расчитываем на версию 2.0
	if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
	{
		printf("WSAStartup() error %i", WSAGetLastError());
		return -1;
	}

	// Создание "слушающего" сокета
	// AF_INET задается всегда
	// SOCK_STREAM означает TCP
	// 0 - оределенный протокол для работы с сокетом не используется
	if((listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{
		printf("socket() error %i", WSAGetLastError());
		return -1;
	}

	// зададим локальный адрес
	listen_addr.sin_family      = AF_INET;
	// IP-адрес, INADDR_ANY = 0.0.0.0 = принимаем с любого адреса
	// функция htonl переворачивает байты (теперь первый - старший), таков порядок
	listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	// порт, который слушаем, и тоже в порядке "первый - старший"
	listen_addr.sin_port        = htons(PORT);

	// Привязка "слушающего" сокета к локальному адресу
	if(bind(listen_socket, (sockaddr*)&listen_addr, sizeof(listen_addr)) == SOCKET_ERROR)
	{
		printf("bind() error %i", WSAGetLastError());
		closesocket(listen_socket);
		WSACleanup();
		return -1;
	}

	// Включение прослушивания на серверном сокете
	// MAXCON - максимальное число одновременных подключений (нам достаточно одного)
	if(listen(listen_socket, MAXCON) == SOCKET_ERROR)
	{
		printf("listen() error %i", WSAGetLastError());
		closesocket(listen_socket);
		WSACleanup();
		return -1;
	}

	// Ждем соединение с клиентом
	// получаем сокет соединения вместе с IP-адресом клиента
	accept_socket = accept(listen_socket, (sockaddr*)&accept_addr, &accepted_len);
	if (accept_socket == INVALID_SOCKET)
	{
		printf("accept() error %i", WSAGetLastError());
		closesocket(listen_socket);
		WSACleanup();
		return -1;
	}
	
	//примем сообщение
	int bytesRecv = SOCKET_ERROR;
	while( bytesRecv == SOCKET_ERROR )	//будет равно только один раз
	{
		//принимаем максимум 5000 байт в буфер Message
		bytesRecv = (int)recv( accept_socket, Message, 5000, 0 );

		//если ничего не приняли или ошибка WSAECONNRESET
		//то делаем вывод, что соединение закрылось
		if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
		{
			printf("\nConnection Closed.\n");
			break;
		}
		//на всякий случай, закроем строку нулем
		Message[bytesRecv] = 0;
	}

	//копируем в другое место
	pr(buf, Message);

	//закрываем сокеты
	closesocket(listen_socket);
	closesocket(accept_socket);
	//прекращаем работу с сокетами
	WSACleanup();
	//выведем принятую строку
	printf("Message: %s", Message);
	return  0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 09.11.2011, 01:21
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное