aboutsummaryrefslogtreecommitdiff
path: root/examples/nativesocketsserver.nim
blob: 71ed56e7c93f0445e1d454963e120f86bb5283d5 (plain)
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
# Copyright (c) 2016, Maxim V. Abramov
# All rights reserved.
# Look at license.txt for more info.

## Simple Bluetooth server implementation based on sockets and RFCOMM protocol.

import os
import ../nimbluez/bluetoothnativesockets

var
  serverPort = RfcommPort(15)
  serverAddress =
    ""
  #  "00:02:72:0F:5C:87"
  #  "AC:7B:A1:55:E6:4A"

var serverSocket = newBluetoothNativeSocket(SOCK_STREAM, BTPROTO_RFCOMM)
if serverSocket == InvalidSocket:
  raiseOSError(osLastError())
try:
  var name = getRfcommAddr(serverPort, serverAddress)
  if bindAddr(serverSocket,
              cast[ptr SockAddr](addr(name)),
              sizeof(name).SockLen) < 0'i32:
      raiseOSError(osLastError())
  if serverSocket.listen() < 0'i32:
    raiseOSError(osLastError())
  echo "Server socket created: ", repr(serverSocket)
  (serverAddress, serverPort) = serverSocket.getRfcommLocalAddr()
  echo "Address: ", serverAddress, ", port: ", serverPort

  while true:
    echo "Waiting for incoming connections..."
    var
      sockAddr = getRfcommAddr()
      addrLen = sizeof(sockAddr).SockLen
    var clientSocket = accept(serverSocket,
                              cast[ptr SockAddr](addr(sockAddr)),
                              addr(addrLen))
    if clientSocket == InvalidSocket:
      raiseOSError(osLastError())
    try:
      var
        clientAddress: string
        clientPort: RfcommPort
      (clientAddress, clientPort) = clientSocket.getRfcommPeerAddr()
      echo "Connection from ", clientAddress, " on port: ", clientPort
      echo "Client socket: ", repr(clientSocket)

      var message = ""
      message.setLen(1000)
      while true:
        echo "Receiving message:"
        let recvLen = clientSocket.recv(cstring(message),
                                        cint(message.len),
                                        cint(0))
        if recvLen < 0'i32:
          message.setLen(0)
          echo osErrorMsg(osLastError())
          break
        message.setLen(recvLen)
        if recvLen == 0'i32:
          break
        echo "  ", message
        echo "Characters received: ", recvLen

        message = "Seven twenty-two in the A.M."
        echo "Sending message:"
        echo "  ", message
        let sentLen = clientSocket.send(cstring(message),
                                        cint(message.len),
                                        cint(0))
        if sentLen < 0'i32:
          raiseOSError(osLastError())
        echo "Characters sent: ", sentLen
    finally:
      clientSocket.close()
      echo "Client socket closed."
finally:
  serverSocket.close()
  echo "Server socket closed."