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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2010, 22:49   #1
i-cpp
Пользователь
 
Регистрация: 05.12.2009
Сообщений: 33
По умолчанию проблема с WinSock

Взялся осваивать работу с сетью. Никак не получается довести до ума передачу сообщения от клиента серверу (мой код с ошибками=) ниже). Никак не пойму как работать с send и recv. Хочется в идеале, чтобы одно приложение обрабатывала массив текстовой инфы и отправляла его другой проге, та в свою очередь тоже обрабатывала свой массив и тоже отправляла его первой проге. Поскольку работаю только с двумя прогами можно использовать архитектуру клиет-клиент, а вообще все равно лишь бы работало.

сервер
Код:
	unsigned short PORT = txtPort->Text.ToDouble();
	// Шаг 1 - инициализация библиотеки Winsock
	char buff[1024]; // Буфер для различных нужд
	if (FAILED (WSAStartup(MAKEWORD( 2, 2 ), (WSADATA *)&buff[0]) ) )
	{
		  ShowMessage("Ошибка WSAStartup");
	}

	// Шаг 2 - создание сокета
	SOCKET s;
	if (INVALID_SOCKET == (s = socket(AF_INET, SOCK_STREAM, 0) ) )
	{
		  ShowMessage("Ошибка socket");
		  WSACleanup(); // Деиницилизация библиотеки Winsock
	}

	// Шаг 3 - связывание сокета с локальным адресом
	sockaddr_in local_addr; // Объявим переменную для хранения локального адреса
	// Заполним ее:
	local_addr.sin_family = AF_INET; // тип адреса (TCP/IP)
	// Используем функцию htons для перевода номера порта из обычного в TCP/IP представление
	local_addr.sin_port = htons (PORT); // Порт
	local_addr.sin_addr.S_un.S_addr = 0; // сервер принимает подключения на все свои IP-адреса

	// вызываем bind для связывания s c local_addr
	if (bind(s, (sockaddr *)&local_addr, sizeof(local_addr)))
	{
		ShowMessage("Ошибка bind");
		closesocket( s ); // закрываем сокет!
		WSACleanup();
	}

    // Шаг 4 - ожидание подключений
	// размер очереди - 0x100
	if (listen(s, 0x100) == SOCKET_ERROR )
	{
		ShowMessage("Ошибка listen");
		closesocket( s ); // закрываем сокет!
		WSACleanup();
	}

	// Шаг 5 - извлекаем сообщение из очереди
	SOCKET client_socket; // сокет для клиента
	sockaddr_in client_addr; // адрес клиента (заполняется системой)

	client_socket = accept( s, NULL, NULL );
	if (client_socket == INVALID_SOCKET) {
		ShowMessage("Ошибка accept");
		closesocket(s);
		WSACleanup();
	} else {
		ShowMessage("new connect!");
	}
	if (SOCKET_ERROR == ( recv(s, &buff[0], strlen(&buff[0]), 0 ) ))
	{
		ShowMessage("Ошибка recv");
		closesocket(s);
		WSACleanup();
	}
	ShowMessage( buff );
клиент
Код:
	unsigned short PORT = txtPort->Text.ToDouble();
	const char *SERVERADDR = txtIP->Text.t_str();
	// Шаг 1 - инициализация библиотеки Winsock
	char buff[1024]; // Буфер для различных нужд
	if (FAILED (WSAStartup(MAKEWORD( 2, 2 ), (WSADATA *)&buff[0]) ) )
	{
		  ShowMessage("Ошибка WSAStartup");
	}

	// Шаг 2 - создание сокета
	SOCKET s;
	if (INVALID_SOCKET == (s = socket(AF_INET, SOCK_STREAM, 0) ) )
	{
		  ShowMessage("Ошибка socket");
		  WSACleanup(); // Деиницилизация библиотеки Winsock
	}

	// Шаг 3 - установка соединения
	sockaddr_in dest_addr; // Объявим переменную для хранения локального адреса
	// Заполним ее:
	dest_addr.sin_family = AF_INET; // тип адреса (TCP/IP)
	// Используем функцию htons для перевода номера порта из обычного в TCP/IP представление
	dest_addr.sin_port = htons (PORT); // Порт
	// TCP/IP представляет адреса в числовом виде, то для перевода адреса используем функцию inet_addr
	if (inet_addr(SERVERADDR) != INADDR_NONE) // адрес сервера
		dest_addr.sin_addr.S_un.S_addr = inet_addr (SERVERADDR);
	else {
			ShowMessage("Ошибка Invalid address");
			closesocket( s ); // закрываем сокет!
			WSACleanup(); // Деиницилизация библиотеки Winsock
	}

	// адрес сервера получен - пытаемся установить соединение
	if (connect(s, (sockaddr *)&dest_addr, sizeof(dest_addr)))
	{
		ShowMessage("Ошибка Connect");
	}

	// Шаг 4 - передача сообщений
	strcpy(buff, "test");
	if (SOCKET_ERROR == ( send (s, &buff[0], strlen(&buff[0]), 0 ) ))
	{
		ShowMessage("Ошибка send");
		closesocket(s);
		WSACleanup();
	}

Последний раз редактировалось i-cpp; 12.02.2010 в 23:13.
i-cpp вне форума Ответить с цитированием
Старый 12.02.2010, 22:55   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Код:
//buff = "test" ;
Кто вас учил так копировать строки?
Код:
strcpy(buff, "test");
И вообще - зачем в статической памяти размещаете буфер?
Сделайте указатель и выделите динамически память, и не будет такого как вы творите &buff[0]
Особенно, если вы работаете в VS. Там такие мутки со статической адресацией массивов, бывает защищенная память... ну вобщем юзайте динамику))

Последний раз редактировалось MaTBeu; 12.02.2010 в 22:59.
MaTBeu вне форума Ответить с цитированием
Старый 12.02.2010, 22:58   #3
i-cpp
Пользователь
 
Регистрация: 05.12.2009
Сообщений: 33
По умолчанию

MaTBeu, с этим согласен сглупил привык к string
Как же до ума отправку сообщений довести
i-cpp вне форума Ответить с цитированием
Старый 12.02.2010, 23:28   #4
i-cpp
Пользователь
 
Регистрация: 05.12.2009
Сообщений: 33
По умолчанию

Код:
	if (SOCKET_ERROR == ( recv(s, &buff[0], strlen(&buff[0]), 0 ) ))
	{
		ShowMessage("Ошибка recv");
		closesocket(s);
		WSACleanup();
	}
нашел ошибку сам в место s - надо было конечно client_socket указать
i-cpp вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock profi Win Api 8 11.01.2010 21:13
WinSock и антикапча HTL Работа с сетью в Delphi 5 05.01.2010 17:36
WinSock Killbrum Win Api 1 18.10.2009 15:15
Winsock не соединяет Da$aD Работа с сетью в Delphi 0 11.07.2008 22:57
Proxy в WinSock SHEI'TI Работа с сетью в Delphi 3 29.03.2008 18:27