Форум программистов, компьютерный форум, киберфорум
Наши страницы
Basic
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Basic Принятие управленческих решений в условиях риска и неопределенности http://www.cyberforum.ru/basic/thread2005235.html
Как исправить эту ошибку? Есть строчка Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Но компилятор ругается говоря "Не допускается допускается применение операторов в...
Basic Вторичные ключи в бд
Есть таблица со вторичными ключами на форме. Как при добавление записи сделать так, чтобы вместо вторичных ключей, были строки из данных таблиц, связанных со вторичными ключами. БД - sql
Напечатать все отрицательные матрицы Basic
Дана матрица С с элементами Сi,j, i=1,2,...5; j=1,2,...5 ; Напечатать все отрицательные Сi,j Спасибо!
Basic Подпрограмма: найти максимальный элемент строки матрицы (Turbo Basic) Найти максимальный элемент строки матрицы(5;5) оформить в виде подпрограммы. Turbo Basic http://www.cyberforum.ru/basic/thread1989747.html
Basic Basic4ppc http://www.cyberforum.ru/basic/thread1987008.html
Доброго времени! Достался мне старый коммуникатор с виндой. Ну не мог я не удержаться и не поставить на него барсика. Конкретно Basic4ppc 6.5. Вопрос к аудитории: А есть ли у кого нибудь русская...
Basic Задачи (Visual Basic)
Здравствуйте, помогите пожалуйста решить одну из задач, желательно с алгоритмом. ( Visual Basic ). Заранее спасибо. 17. В двумерном массиве М(5,4) целых чисел поменять местами строки и столбцы с...
Дана матрица А(5´5). Получить вектор Basic
Дана матрица А(5´5). Получить вектор В={b1,b2,b3,b4,b5} такой, что bi равно среднему арифметическому i-й строки матрицы А. Нахождение максимального элемента строки матрицы оформить в виде...
Basic Составить блок-схему алгоритма, определяющего принадлежность точки с координатами (x,y) закрашенной области н Помогите пожалуйста. Непонятен процесс выполнения задания. Не могли бы вы мне растолковать? http://www.cyberforum.ru/basic/thread1983551.html
Basic Программа free basic http://www.cyberforum.ru/basic/thread1972657.html
В исходной строке a, состоящей из цифр, определить среднее арифметическое цифр, входящих в строку. Вывести результат.
Basic Вычислить произведение элементов массива, расположенных между максимальным и минимальным элементами Всем привет, вот нужно написать программу для экзамена, но увы я не знаю этот язык, у нас его не преподовали. Помогите пожалуйста... В одномерном массиве, состоящем из 15 вещественных элементов... http://www.cyberforum.ru/basic/thread1972501.html
Замабувараев
352 / 359 / 93
Регистрация: 18.12.2014
Сообщений: 728
Записей в блоге: 1
0

FreeBASIC и сети

17.07.2017, 15:45. Просмотров 841. Ответов 3
Метки (Все метки)

Здравствуй, форум. Всё дело в том, что есть одни сетевые функции, и для этих функций Я решил написать обёртку. Чтобы не возиться созданием сокетов.

Заголовочный файл "Network.bi"
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef unicode
    #define unicode
#endif
#include once "windows.bi"
#include once "win\winsock2.bi"
#include once "win\ws2tcpip.bi"
 
' Соединиться с сервером и вернуть сокет
DECLARE FUNCTION ConnectToServer(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr, BYVAL LocalAddress AS WString Ptr, BYVAL LocalPort AS WString Ptr)AS SOCKET
 
' Создать прослушивающий сокет, привязанный к адресу
DECLARE FUNCTION CreateSocketAndListen(BYVAL LocalAddress AS WString Ptr, BYVAL LocalPort AS WString Ptr)AS SOCKET
 
' Закрывает сокет
DECLARE SUB CloseSocketConnection(BYVAL mSock AS SOCKET)
 
' Создать сокет, привязанный к адресу
DECLARE FUNCTION CreateSocketAndBind(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr)AS SOCKET
 
' Разрешение доменного имени
DECLARE FUNCTION ResolveHost(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr)AS addrinfoW Ptr
Файл "Network.bas"
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include once "Network.bi"
 
SUB CloseSocketConnection(BYVAL mSock AS SOCKET)
    Shutdown(mSock, 2)
    closesocket(mSock)
END SUB
 
FUNCTION ResolveHost(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr)AS addrinfoW Ptr
    DIM hints AS addrinfoW
    ' Если стоит AF_UNSPEC, то неважно, IPv4 или IPv6
    hints.ai_family = AF_UNSPEC ' AF_INET или AF_INET6
    hints.ai_socktype = SOCK_STREAM
    hints.ai_protocol = IPPROTO_TCP
    
    DIM pResult AS addrinfoW Ptr = 0
    IF GetAddrInfoW(sServer, Port, @hints, @pResult) = 0 THEN
        RETURN pResult
    END IF
    RETURN 0
END FUNCTION
 
FUNCTION CreateSocketAndBind(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr)AS SOCKET
    ' Открыть сокет
    DIM iSocket AS SOCKET = socket_(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP)
    IF iSocket <> INVALID_SOCKET THEN
        ' Привязать адрес к сокету
        DIM localIpList AS addrinfoW Ptr = ResolveHost(sServer, Port)
        IF localIpList <> 0 THEN
            ' Обойти список адресов и сделать привязку
            DIM pPtr AS addrinfoW Ptr = localIpList
            DIM BindResult AS INTEGER = ANY
            DO
                BindResult = bind(iSocket, Cast(LPSOCKADDR, pPtr->ai_addr), pPtr->ai_addrlen)
                IF BindResult = 0 THEN
                    ' Привязано
                    EXIT DO
                END IF
                pPtr = pPtr->ai_next
            LOOP UNTIL pPtr = 0
            ' Очистка
            FreeAddrInfoW(localIpList)
            ' Привязались к адресу
            IF BindResult = 0 THEN
                RETURN iSocket
            END IF
        END IF
        CloseSocketConnection(iSocket)
    END IF
    RETURN INVALID_SOCKET
END FUNCTION
 
FUNCTION CreateSocketAndListen(BYVAL LocalAddress AS WString Ptr, BYVAL LocalPort AS WString Ptr)AS SOCKET
    ' Открыть сокет
    DIM iSocket AS SOCKET = CreateSocketAndBind(LocalAddress, LocalPort)
    IF iSocket <> INVALID_SOCKET THEN
        ' Начать прослушивание
        IF listen(iSocket, 1) <> SOCKET_ERROR THEN
            RETURN iSocket
        END IF
        CloseSocketConnection(iSocket)
    END IF
    RETURN INVALID_SOCKET
END FUNCTION
 
FUNCTION ConnectToServer(BYVAL sServer AS WString Ptr, BYVAL Port AS WString Ptr, BYVAL LocalAddress AS WString Ptr, BYVAL LocalPort AS WString Ptr)AS SOCKET
    ' Открыть сокет
    DIM iSocket AS SOCKET = CreateSocketAndBind(LocalAddress, LocalPort)
    IF iSocket <> INVALID_SOCKET THEN
        ' Привязать адрес к сокету
        DIM localIpList AS addrinfoW Ptr = ResolveHost(sServer, Port)
        IF localIpList <> 0 THEN
            ' Обойти список адресов и сделать привязку
            DIM pPtr AS addrinfoW Ptr = localIpList
            DIM ConnectResult AS INTEGER = ANY
            DO
                ConnectResult = connect(iSocket, Cast(LPSOCKADDR, pPtr->ai_addr), pPtr->ai_addrlen)
                IF ConnectResult = 0 THEN
                    ' Соединено
                    EXIT DO
                END IF
                pPtr = pPtr->ai_next
            LOOP UNTIL pPtr = 0
            ' Очистка
            FreeAddrInfoW(localIpList)
            ' Соединение установлено
            IF ConnectResult = 0 THEN
                RETURN iSocket
            END IF
        END IF
        CloseSocketConnection(iSocket)
    END IF
    RETURN INVALID_SOCKET
END FUNCTION
Добавлено через 1 час 5 минут
Вот пример создания сервера, который принимает данные от клиента и отправляет их обратно.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include once "Network.bi"
 
' IP‐адрес, с которого сервер будет принимать соединения
CONST LocalAddress = "0.0.0.0"
CONST LocalPort = "8080"
CONST BufferSize AS INTEGER = 4096
 
DIM objWsaData AS WSAData = ANY
IF WSAStartup(MAKEWORD(2, 2), @objWsaData) <> NO_ERROR THEN
    ' Ошибка инициализации
    END(1)
END IF
 
' Создать прослушивающий сокет
DIM ListenSocket AS SOCKET = CreateSocketAndListen(LocalAddress, LocalPort)
IF ListenSocket = INVALID_SOCKET THEN
    ' Ошибка создания прослушивающего сокета
    WSACleanup()
    END(2)
END IF
 
' Принять соединение
DIM RemoteAddress AS SOCKADDR_IN = ANY
DIM RemoteAddressLength AS LONG = SizeOf(RemoteAddress)
DIM ClientSocket AS SOCKET = accept(ListenSocket, CPtr(SOCKADDR Ptr, @RemoteAddress), @RemoteAddressLength)
 
DO UNTIL ClientSocket = INVALID_SOCKET
    DIM buffer AS ZString * BufferSize = ANY
    ' Принять данные от клиента
    DIM intReceivedBytesCount AS INTEGER = recv(ClientSocket, @buffer, BufferSize, 0)
    IF intReceivedBytesCount > 0 OrElse intReceivedBytesCount <> SOCKET_ERROR THEN
        ' Отправить обратно их же
        DIM intSendBytesCount AS INTEGER = send(ClientSocket, @buffer, intReceivedBytesCount, 0)
    END IF
    ' Закрыть
    CloseSocketConnection(ClientSocket)
    ' Принять вновь
    ClientSocket = accept(ListenSocket, CPtr(SOCKADDR Ptr, @RemoteAddress), @RemoteAddressLength)
LOOP
 
' Закрыть
CloseSocketConnection(ListenSocket)
WSACleanup()
Добавлено через 1 минуту
А вот пример создания клиента, который соединяется с сервером, отправляет данные, принимает данные, выводит их на консоль и завершается.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include once "Network.bi"
 
' Адрес сервера
CONST ServerAddress = "127.0.0.1"
' Порт сервера
CONST ServerPort = "8080"
' Адрес сетевой карты, с которого будет идти соединение к серверу
CONST LocalBindAddress = "0.0.0.0"
CONST LocalBindPort = "0"
 
CONST BufferSize AS INTEGER = 4096
 
DIM objWsaData AS WSAData = ANY
IF WSAStartup(MAKEWORD(2, 2), @objWsaData) <> NO_ERROR THEN
    ' Ошибка инициализации
    END(1)
END IF
 
' Соединиться с сервером
DIM ClientSocket AS SOCKET = ConnectToServer(@ServerAddress, @ServerPort, @LocalBindAddress, @LocalBindPort)
IF ClientSocket = INVALID_SOCKET THEN
    PRINT "Ошибка"
ELSE
    ' Отправить строку "Привет, мир!" на сервер
    CONST HelloWorld = "Привет, мир!"
    send(ClientSocket, CPtr(ZString Ptr, @HelloWorld), (LEN(HelloWorld) + 1) * SizeOf(WString), 0)
    
    ' Принять данные с сервера
    DIM buffer AS WString * BufferSize = ANY
    DIM intBytesCount AS INTEGER = recv(ClientSocket, CPtr(ZString Ptr, @buffer), BufferSize, 0)
    ' Напечатать
    PRINT buffer
END IF
 
' Закрыть
CloseSocketConnection(ClientSocket)
WSACleanup()


Вернуться к обсуждению:
FreeBASIC и сети
2
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2017, 15:45
Готовые ответы и решения:

FreeBASIC
Заметил, что уже имеющиеся на форуме темы в разделах: - QBasic - Visual Basic - VBA - Pure...

Немного о FreeBasic
Чаще всего при начальном использовании какого-то языка , люди стараются выбрать простую,...

Графика FreeBasic
Приветствую всех cyber-форумчан!:) Несмотря на наличие графического треда в младшем разделе,...

Осваиваю (ем) FreeBasic
Решил больше не тянуть, а приступить сегодня. Если тема будет актуальна - возможно модераторы...

FreeBasic. MyFbFramework + VisualFBEditor
Начал новый фреймворк для FreeBasic: MyFbFramework И редактор для него: VisualFBEditor Файлы...

3
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru