Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных между приложениями по сети, xSocket 
:(
    Опции темы
quarz
Дата 6.3.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Как в BCB 6 работать с сокетами? Нужно по сети (интернет, локальная) передать данные из одного приложения в другое.
PM MAIL   Вверх
Гость_Влад
Дата 7.3.2005, 20:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Работа с сокетами описана в книге “Приемы программирования в C++ Builder. Механизмы Windows, сети”. Авторы А.Я. Архангельский, М.А. Тагин.
  Вверх
$nick$
Дата 7.3.2005, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2005
Где: Navashino town

Репутация: нет
Всего: нет



Да посмотри там точно есть, а еще по-моему это уже обсуждалось.
PM MAIL   Вверх
$nick$
Дата 7.3.2005, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2005
Где: Navashino town

Репутация: нет
Всего: нет



Приведу хотя бы немного кода, хотя из 5-го Buildera, но мыслю хотябы уловишь.

#include <stdio.h>
#include <string.h>
// Для работы с библиотекой Winsock2 в исходный текст нужно включить директиву #include <winsock2.h>,
//а в командной строке компоновщика указать ws2_32.lib. Библиотека Winsock2 должна быть указана раньше,
// чем библиотека Windows.
#include <winsock2.h>
#include <windows.h>

#define PORT 31337 // Порт, через который идет подключение к серверу....21,80,25,110 и т.п.
#define SERVERADDR "127.0.0.1" // Адрес сервера

int main ( int argc, char* argv [ ] )
{
char buff [ 1024 ] ;
printf ( "TCP Client \n" ); // ну, тут и так понятно
//Перед началом использования библиотеки ее необходимо подготовить к работе с помощью вызова функции
// WSAStartup(Ver, lpWSAData), передав ей в старшем байте номер требуемой версии, а в младшем подверсии.
// Аргумент lpWSAData должен указывать на структуру WSADATA, в которую при успешной инициализации
//будет занесена информация о производителе библиотеки. Если инициализация не удалась, то функция //возвращает не нулевое значение.
if ( WSAStartup ( 0x202, ( WSADATA * ) &buff [ 0 ] ) )
{
printf ( " WSAStart error %d \n ", WSAGetLastError ( ) );
return -1;
}
// Создаем сокет socket ( int af, int type, int protocol ). Первый слева аргумент указывает на семейство использу-
//емых протоколов, AF_INET - используеться при создании интернет приложений. SOCK_STREAM - тип //создаваемого сокета, SOCK_STREAM (потоковый) или SOCK_DGRAM (дейтаграммный) или SOCK_RAW //(сырой).Последний аргумент задает тип создаваемого сокета, нулевое значение соответствует выбору по //умолчанию, ТСР - для потоковых, и UDP - дейтограммных.
//Если функция завершилась успешно то она возвращает дескриптор сокета.
SOCKET my_sock ;
my_sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( my_sock < 0 ) //
{
printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) );
return -1;
}
//Далее расмотрим установку соединения. Заполнение структуры sockaddr_in :
sockaddr_in dest_addr ;
dest_addr.sin_family=AF_INET; //инет коннектинг
dest_addr.sin_port=htons ( PORT ); //порт
HOSTENT *hst; // хост
// Преобразование ip-адреса из символьного в сетевой формат.
if ( inet_addr ( SERVERADDR ) !=INADDR_NONE ) dest_addr.sin_addr=inet_addr ( SERVERADDR) ;
else
//Осуществляем поптыку получения ip-адреса по доменному имени сервера.
if ( hst=gethostbyname ( SERVERADDR ) ) ( ( unsigned long * ) &dest_addr.sin_addr ) [ 0 ] =
//hst->h_addr_list содержит массив указателей на адреса, НО не массив адресов
( ( unsigned long ** ) hst->h_addr_list ) [ 0 ] [ 0 ] ;
//Если ip-адрес не получен, то работа программы завершаеться
else
{
printf ( " invalid address %s \n ", SERVERADDR ) ;
closesocket ( my_sock ) ;
WSACleanup ( ) ;
return -1;
}
//После получения адреса сервера, попытаемся установит соединение.Для этого мы вызовем функцию connect
// (SOCKET s, sockaddr * name, len). Первый элемент -SOCKET- это дескриптор сокета, второй -
//указатель на структуру sockaddr, содержащую в себе адрес (ip) и порт, последний аргумент сообщает о размере
// sockaddr.
// Если по каким-то причинам установить соединение не удаеться, то функция возвращает не нулевое значение.
if (connect ( my_sock, ( sockaddr * ) &dest_addr, sizeof ( dest_addr ) ) )
{
printf (" Connect error %d \n ", WSAGetLastError ( ) );
return -1;
}

printf (" Соединение с %s успешно установлено \n\ Type quit for quit \n\n" , SERVERADDR );
//Далее начинаеться чтение и передача сообщений.
int nsize;
while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR )
{
//Ставим завершающий ноль в конце строки
buff[ nsize ] =0;
//Выводим на экран
printf ( " S=>C: %s ", buff ) ;
//Читаем пользовательский ввод с клавиатуры
printf ( "S<=C: " ) ;
fgets ( &buff [ 0 ] , sizeof ( buff ) -1, stdin );
//После того, как ввели слово quit, выходим.....
if ( !strcmp ( &buff [ 0 ], "quit \n " ) )
{
printf ( " Exit " );
closesocket ( my_sock ) ; //выход правильный
WSACleanup ( ) ;
return 0;
}
//Передача строки клиента серверу
send ( my_sock, &buff [ 0 ], nsize, 0 ) ;
}

printf ( " Recv error %d \n", WSAGetLastError ( ) );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
return -1;
}

PM MAIL   Вверх
quarz
Дата 8.3.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Спасибо $nick$, буду пробовать
PM MAIL   Вверх
En_t_end
Дата 8.3.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Не забываем про особенность closesocket - закрывает сокет только после передачи всех данных, я бы советовал юзать shutdown - надежнее в плане дальнейшего использования этого же сокета.
Буфер тоже надо отчищать. Если будешь делать низкоуровнево - напиши свою функцию, если обьект класса CSocket - там есть член-функция для этого.
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3159 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.