![]() |
|
|
![]()
|
|
| quarz |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 7.1.2005 Репутация: нет Всего: 3 |
Как в BCB 6 работать с сокетами? Нужно по сети (интернет, локальная) передать данные из одного приложения в другое.
|
|||
|
||||
| Гость_Влад |
|
|||
|
Unregistered |
Работа с сокетами описана в книге “Приемы программирования в C++ Builder. Механизмы Windows, сети”. Авторы А.Я. Архангельский, М.А. Тагин.
|
|||
|
||||
| $nick$ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 20.2.2005 Где: Navashino town Репутация: нет Всего: нет |
Да посмотри там точно есть, а еще по-моему это уже обсуждалось.
|
|||
|
||||
| $nick$ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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; } |
|||
|
||||
| quarz |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 7.1.2005 Репутация: нет Всего: 3 |
Спасибо $nick$, буду пробовать
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Не забываем про особенность closesocket - закрывает сокет только после передачи всех данных, я бы советовал юзать shutdown - надежнее в плане дальнейшего использования этого же сокета.
Буфер тоже надо отчищать. Если будешь делать низкоуровнево - напиши свою функцию, если обьект класса CSocket - там есть член-функция для этого. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |