Опытный
 
Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань
Репутация: 9 Всего: 17
|
Пример работы для BCB 6 если не использовать компоненты Код | #include <stdio.h> #include <string.h> // Для работы с библиотекой Winsock2 в исходный текст нужно включить директиву //#include <winsock2.h>, #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; }
|
--------------------
0x2b|~0x2b
|