Нужна помощь в клент-серверном приложении.
|
|
ilya7834 | Дата: Суббота, 06.10.2012, 19:56 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| В общем делаю собственное приложение по типу клиент-сервер. Использую UPD. Коды: main.bas Code #Include "allinclude.bi" Dim hwnd As HWND Dim sock As socket Dim servaddr As sockaddr_in With servaddr .sin_family = AF_INET .sin_port = htons (9001) ' à âîò òóò óæå óêàçûâàåì ïîðò, êîòîðûé ñëóøàåò ñåðâåð .sin_addr.s_addr = inet_addr ("127.0.0.1") ' ýòî IP ñåðâåðà End With Dim buff As ZString*64 buff="123445" hwnd=OpenWindow("Client", 100, 100, 100, 100) sock=InitSocket(hwnd) Do Var event=WindowEvent If event=EventClose then End End If SendPocket(sock, buff, servaddr, hwnd) Loop client.bi: Code #Include "windows.bi" #Include "win/winsock.bi"
Function InitSocket(hwnd As HWND) As socket Dim wsaData As WSADATA If WSAStartup (MAKEWORD (2, 0), @wsaData) = SOCKET_ERROR Then MessageBox(hwnd, "Socket error", "=*ERROR*=", MB_OK) End End If
Dim sd As socket sd = opensocket (PF_INET, SOCK_DGRAM, IPPROTO_UDP) If sd = INVALID_SOCKET Then MessageBox(hwnd, "Socket open error", "*=ERROR=*", MB_OK) WSACleanup () End End If
Dim sa As sockaddr_in With sa .sin_family = AF_INET .sin_port = 0 ' ïåðâîå îòëè÷èå - ëîêàëüíûé ïîðò êëèåíòà íå âàæåí, winsock ñàìà âûáåðåò ïîäõîäÿùèé ñâîáîäíûé ' ÂÍÈÌÀÍÈÅ! åñëè óêàçàòü çäåñü ïîðò ñåðâåðà, ïîñëå bind () ïîëó÷èòå îøèáêó 10048 "ïîðò çàíÿò" .sin_addr.s_addr = INADDR_ANY End With If bind (sd, @sa, SizeOf (sa)) = SOCKET_ERROR Then MessageBox(hwnd, "Bind error", "*=ERROR=*", MB_OK) closesocket (sd) WSACleanup () End End If Return sd End Function Sub SendPocket(sd As socket, sendBuff As ZString*64, servaddr As sockaddr_in, hwnd As HWND) If sendto (sd, @sendBuff, SizeOf (sendBuff), 0, @servaddr, SizeOf (servaddr)) = SOCKET_ERROR Then MessageBox(hwnd, "Error in sending", "ERROR", MB_OK) End If End Sub server.bas: Code #Include "windows.bi" #Include "win/winsock.bi"
Dim wsaData As WSADATA If WSAStartup (MAKEWORD (2, 0), @wsaData) = SOCKET_ERROR Then Print "Winsok init error "; WSAGetLastError () Sleep End End If
Dim Shared sd As socket sd = opensocket (PF_INET, SOCK_DGRAM, IPPROTO_UDP) If sd = INVALID_SOCKET Then Print "Socket open error "; WSAGetLastError () WSACleanup () Sleep End End If
Dim Shared sa As sockaddr_in With sa .sin_family = AF_INET .sin_port = htons (9001) .sin_addr.s_addr = INADDR_ANY End With If bind (sd, @sa, SizeOf (sa)) = SOCKET_ERROR Then Print "Bind error "; WSAGetLastError () closesocket (sd) WSACleanup () Sleep End End If
Dim recvBuff As ZString * 64 Dim numrecv As Integer
Do Do numrecv = recv (sd, @recvBuff, SizeOf (recvBuff), 0) recvBuff[numrecv] = 0 Loop Until Len (recvBuff) > 1 Print recvBuff Loop Until numrecv = -1
closesocket (sd) WSACleanup End Компилируется без ошибок, но при запуске просто ничего не происходит! То ли пакеты не посылаются, то ли не принимаются. Если кто знает - помогите. Или скиньте рабочий код, можно TCP.
|
|
| |
haav | Дата: Суббота, 06.10.2012, 21:26 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Попробуй так Илья:
main.bas:
Code #Include "window9.bi" #Include "client.bi" Dim hwnd As HWND Dim sock As socket Dim servaddr As sockaddr_in With servaddr .sin_family = AF_INET .sin_port = htons (9001) .sin_addr.s_addr = inet_addr ("127.0.0.1") End With Dim buff As ZString*64 buff="123445" hwnd=OpenWindow("Client", 100, 100, 100, 100) sock=InitSocket(hwnd) Do Var event=WindowEvent If event=EventClose then End End If SendPocket(sock, @buff, servaddr, hwnd) Loop
client.bi
Code #Include "windows.bi" #Include "win/winsock.bi"
Function InitSocket(hwnd As HWND) As socket Dim wsaData As WSADATA If WSAStartup (MAKEWORD (2, 0), @wsaData) = SOCKET_ERROR Then MessageBox(hwnd, "Socket error", "=*ERROR*=", MB_OK) End End If
Dim sd As socket sd = opensocket (PF_INET, SOCK_DGRAM, IPPROTO_UDP) If sd = INVALID_SOCKET Then MessageBox(hwnd, "Socket open error", "*=ERROR=*", MB_OK) WSACleanup () End End If
Dim sa As sockaddr_in With sa .sin_family = AF_INET .sin_port = 0 .sin_addr.s_addr = INADDR_ANY End With If bind (sd, @sa, SizeOf (sa)) = SOCKET_ERROR Then MessageBox(hwnd, "Bind error", "*=ERROR=*", MB_OK) closesocket (sd) WSACleanup () End End If Return sd End Function Sub SendPocket(sd As socket, sendBuff As ZString Ptr, servaddr As sockaddr_in, hwnd As HWND) If sendto (sd, sendBuff, len(*sendBuff), 0, @servaddr, SizeOf (servaddr)) = SOCKET_ERROR Then MessageBox(hwnd, "Error in sending", "ERROR", MB_OK) End If End Sub
На будующее:
1) Мне бы было легче понять код, если бы в коде комментарии были без крякозябр. Я понимаю, что это косячит FbEdit иногда. Чтобы избежать крякозябр, достаточно сохранить файл, закрыть редактор и снова открыть файл в редакторе, потом можно копировать.
2) Если внимательно посмотреть, то видно: файла allinclude.bi нет в выложенных кодах. В данном случае сообразить что да как было несложно, но кто знает , в других примерах может быть все сложнее.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ilya7834 | Дата: Воскресенье, 07.10.2012, 18:14 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| Попробую код вечером. Насчет кракозябр просто не знал как лечить. В "олинклуд" прописаеы подключения всех файлов кода. Я и расчитывал что все будет понятно.Добавлено (07.10.2012, 18:14) --------------------------------------------- Проверил, все работает, спасибо большое. Проект разрабатываю немаленький, вопросов будет еще много.
|
|
| |
12valera12 | Дата: Суббота, 30.01.2021, 11:54 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 9
Статус: Offline
| haav, подскажите можно ли UDP пакет отправленный с esp8266 принять на компьютере с помощью freebasic ? https://www.youtube.com/watch?v=6auIrx3nUUA&list=LL&index=5 в ссылке ардуинсике исходники на видео где мастером esp8266 и клиентами две другие esp8266 а мне хотелось бы клиентом компьютер с wi fi лог адрес порт
WiFi connected IP address: 192.168.1.102 Broadcast address: 192.168.1.255 Starting UDP Local port: 54321 Turn led on Turn led off
|
|
| |
haav | Дата: Суббота, 30.01.2021, 18:01 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата 12valera12 ( ) haav, подскажите можно ли UDP пакет отправленный с esp8266 принять на компьютере с помощью freebasic ? Если знаний хватает для программирования обоих устройств (MK и PC) , то все реализуемо. Я лично с MK (atmega) только баловался. По сути собирал простенькие схемы и писал очень примитивные программы , но не в ардуино , а используя СИ и ASM. С esp8266 дела не имел, и даже приблизительно не знаю , как там и что. А под PC особо не важно на чем писать , лишь бы в языке была возможность взаимодействовать с API системы (с сокетами). У FB такой функционал присутствует.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|