[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ICMP socket with Gambas
[Thread Prev] | [Thread Next]
- Subject: Re: ICMP socket with Gambas
- From: vuott@xxxxxxxxxxxx
- Date: Sun, 29 Jun 2025 15:59:45 +0200 (CEST)
- To: Lee <t.lee.davidson@xxxxxxxxx>
- Cc: User <user@xxxxxxxxxxxxxxxxxxxxxx>
Hello Lee,
...and now ?
[code]
Private Const BUFFER_SIZE As Integer = 1024
Library "libc:6"
Private Enum IPPROTO_IP, IPPROTO_ICMP, AF_INET, SOCK_DGRAM = 2, SOCK_RAW, IP_HDRINCL = 3, IPPROTO_TCP = 6
Public Struct SockAddr
SinFamily As Short
SinPort As Short
SinAddr As Pointer
End Struct
Public Struct timeval
tv_sec As Long
tv_usec As Long
End Struct
Private Extern socket(domain As Integer, type As Integer, protocol As Integer) As Integer
Private Extern close(sockfd As Integer) As Integer
Private Extern inet_pton(af As Integer, src As String, dst As Pointer) As Integer
Private Extern sendto(sockfd As Integer, buf As Byte[], size As Integer, flags As Integer, sockaddr As SockAddr, addrlen As Integer) As Integer
' int gettimeofday (struct timeval *__restrict __tv, void *__restrict __tz)
' Get the current time of day, putting it into *TV.
Private Extern gettimeofday(__tv As Timeval, __tz As Pointer) As Integer
' Read N bytes into BUF through socket FD.
' ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
Private Extern recvfrom(__fd As Integer, __buf As Byte[], __ As Long, __flags As Integer, __addr As Pointer, __addr_len As Pointer) As Long
Private Sub CalcChecksum(aHeader As Byte[]) As Short
Dim iSum As Long
Dim iVal As Short
For i As Integer = 0 To aHeader.Max Step 2
iVal = (CShort(aHeader[i]) Lsl 8) + aHeader[i + 1]
iSum += iVal
Next
While iSum > &HFFFF&
iSum = (iSum Lsr 16) + (iSum And &HFFFF)
Wend
Return Not iSum
End
Public Sub Main()
Dim sockfd, rc, buffer_len As Integer
Dim aHeader As Byte[] = [8, 0, 0, 0, 0, 0, 0, 0]
Dim iChecksum As Short
Dim DestAddr As New SockAddr
Dim buffer As New Byte[BUFFER_SIZE]
Dim start_time, end_time As New Timeval
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)
If sockfd < 0 Then 'error
Print "Socket call error: " & System.Error
Quit
Endif
DestAddr.SinFamily = AF_INET
DestAddr.SinPort = 0
DestAddr.SinAddr = Alloc(SizeOf(gb.Pointer), 2)
rc = inet_pton(AF_INET, "8.8.8.8", DestAddr.SinAddr)
If rc < 1 Then
Print "Error converting address."
Quit
Endif
iChecksum = CalcChecksum(aHeader)
aHeader[2] = (iChecksum Lsr 8) And &HFF
aHeader[3] = iChecksum And &HFF
gettimeofday(start_time, 0)
Dim p As Pointer = Alloc(32)
Dim st As Stream
st = Memory p For Write
Write #st, DestAddr.SinFamily As Short
Write #st, 0 As Short
Write #st, DestAddr.SinAddr, 16
st.Close
rc = sendto(sockfd, aHeader, 8, 0, p, Object.SizeOf(DestAddr))
If rc < 0 Then
Print "Send error:", System.Error
Else
Print "Bytes sent:", rc
Endif
Free(p)
Free(DestAddr.SinAddr)
buffer_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, 0, 0)
If buffer_len < 0 Then Error.Raise("Errore !")
gettimeofday(end_time, 0)
Dim latency As Float = (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec) / 1000000.0
Print "Latency: ", latency; " seconds"
Finally
If sockfd Then
rc = close(sockfd)
Endif
If rc < 0 Then 'error
Print "Close error: " & System.Error
Endif
Catch
Debug Error.Text;; "at";; Error.Where
End
[/code]
_____________________________________________
29 giu 2025, 06:30 da t.lee.davidson@xxxxxxxxx:
> On 6/28/25 10:26 AM, vuott@xxxxxxxxxxxx wrote:
>
>> Uhmmm... sorry, correct structure is:
>>
>> Public Struct SockAddr
>> SinFamily As SHORT
>> SinPort As SHORT
>> SinAddr As Pointer
>> End Struct
>>
>> (with SHORT, not Integer)
>>
>
> Thank you. I tried it, and that doesn't work just a my code didn't work. No address number gets stuffed into the structure.
>
> I made a few changes in my own code, and with the following (including only the pertinent snippets):
> [code]
>
> Public Struct In_addr
> s_addr As Integer
> End Struct
>
> Public Struct Sockaddr_in
> sin_family As Short
> sin_port As Short
> sin_addr As Struct In_addr
> End Struct
>
> ' Now to Main() and,
> ' Of course create the socket already, then...
>
> DestAddr = New Sockaddr_in
> DestAddr.sin_family = AF_INET
> DestAddr.sin_port = 4096
> rc = inet_pton(AF_INET, "127.0.0.1", DestAddr.sin_addr)
>
> For p As Integer = 0 To Object.SizeOf(DestAddr) - 1
> Print "Offset:";; p, Byte@(Object.Data(DestAddr) + p), Hex(Byte@(Object.Data(DestAddr) + p))
> Next
>
> [/code]
>
> This is the output:
> Offset: 0 2 2
> Offset: 1 0 0
> Offset: 2 0 0
> Offset: 3 16 10
> Offset: 4 0 0
> Offset: 5 0 0
> Offset: 6 0 0
> Offset: 7 0 0
> Offset: 8 127 7F
> Offset: 9 0 0
> Offset: 10 0 0
> Offset: 11 1 1
> Offset: 12 0 0
> Offset: 13 0 0
> Offset: 14 0 0
> Offset: 15 0 0
>
> Data at offsets 4-7 and 12-15 are extraneous bytes that seem to come from the ether. The ICMP message gets sent to "0.0.0.0" (offsets 4-7), which is nowhere, because that is where `sendto` looks for the address.
>
> If I comment out the "sin_addr" member in the Sockaddr_in structure, DestAddr is 8 bytes in size when, it seems to me, it should be only 4. Perhaps Object.SizeOf() is seeing the object as a pointer (8 bytes) instead of reporting the size of its structured data.
>
>
> --
> Lee
>
> --- Gambas User List Netiquette [https://gambaswiki.org/wiki/doc/netiquette] ----
> --- Gambas User List Archive [https://lists.gambas-basic.org/archive/user] ----
>
>
| Re: ICMP socket with Gambas - working | Lee <t.lee.davidson@xxxxxxxxx> |
| Re: ICMP socket with Gambas - also working | Lee <t.lee.davidson@xxxxxxxxx> |
| Re: ICMP socket with Gambas | Lee <t.lee.davidson@xxxxxxxxx> |
| Re: ICMP socket with Gambas | Linus <olivier.cruilles@xxxxxxxx> |
| Re: ICMP socket with Gambas | Lee <t.lee.davidson@xxxxxxxxx> |
| Re: ICMP socket with Gambas | vuott@xxxxxxxxxxxx |
| Re: ICMP socket with Gambas | Lee <t.lee.davidson@xxxxxxxxx> |