FreeBasic
Главная
Вход
Регистрация
Воскресенье, 13.10.2024, 08:07Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Нужна помощь в клент-серверном приложении.
ilya7834Дата: Суббота, 06.10.2012, 19:56 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Попробую код вечером. Насчет кракозябр просто не знал как лечить.
В "олинклуд" прописаеы подключения всех файлов кода. Я и расчитывал что все будет понятно.

Добавлено (07.10.2012, 18:14)
---------------------------------------------
Проверил, все работает, спасибо большое. Проект разрабатываю немаленький, вопросов будет еще много. cool

 
12valera12Дата: Суббота, 30.01.2021, 11:54 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: 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
Репутация: 49
Статус: Offline
Цитата 12valera12 ()
haav, подскажите можно ли UDP пакет отправленный с esp8266 принять на компьютере с помощью freebasic ?

Если знаний хватает для программирования обоих устройств (MK и PC) , то все реализуемо. Я лично с MK (atmega) только баловался. По сути собирал простенькие схемы и писал очень примитивные программы , но не в ардуино , а используя СИ и ASM. С esp8266 дела не имел, и даже приблизительно не знаю , как там и что. А под PC особо не важно на чем писать , лишь бы в языке была возможность взаимодействовать с API системы (с сокетами). У FB такой функционал присутствует.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: