[fpc-pascal] Unit "Sockets"

Daniël Mantione daniel.mantione at freepascal.org
Thu Nov 16 11:26:26 CET 2006



Op Thu, 16 Nov 2006, schreef Rainer Stratmann:

> Am Donnerstag, 16. November 2006 10:58 schrieb Marco van de Voort:
> > > does there exist a Demo Program for Unit Sockets?
> > > I want to make a direct IPX connection between 2 Computers.
> > > And later an Internet connection.
> >
> > Which OS? Anyway, socket is mainly about TCP/IP, and there are demoes in
> > the description of the unit in the manual.
> 
> Linux OS.
> Where exactly can it be found?
> 
> > Why do you want to use IPX in this day and age?
> 
> Because it seems the easiest way to port a DOS Program into Linux, because now 
> I use also IPX in the DOS Program.
> IPX is a very low level, and if it woul be possible to send IPX packets 
> without unit socket, it would also be good.
> May be later I would like to switch to an up to date protocol.

Below is some Linux IPX code I wrote once. In assembler. Perhaps it is of 
some use for you.

Daniël







%define         IPX_NODE_LEN    6

%define         IPX_USER_PTYPE  0
%define         IPX_RIP_PTYPE   1
%define         IPX_SAP_PTYPE   4

%define         MSG_DONTWAIT    $40

struc   sockaddr_ipx
.family         USHORT  1
.port           USHORT  1
.network        ULONG   1
.node           UCHAR   IPX_NODE_LEN
.type           UCHAR   1
.zero           UCHAR   1               ; to make structure 16 bytes long
endstruc
[SECTION .data]

ipx_proc_file           db '/proc/net/ipx',0

; Transport Tycoon uses IPX port $5115, but we should reverse the bytes
; because ports are specified in big endian

addr:   istruc sockaddr_ipx
        at sockaddr_ipx.family,   dw AF_IPX
        at sockaddr_ipx.port,     dw $1551
        at sockaddr_ipx.network,  dd 0
        at sockaddr_ipx.node,     db 0,0,0,0,0,0
        at sockaddr_ipx.type,     db IPX_USER_PTYPE
        at sockaddr_ipx.zero,     db 0
iend

addr_size               dd sockaddr_ipx_size

;
; Open an IPX socket. Original at $128207
; We open a socket and bind it to the right port.
;

open_ipx_socket:
    sys_socket PF_IPX,SOCK_DGRAM,PF_IPX
    _cmp eax,0
    js .nosocket
    push eax
    sys_bind eax,addr,sockaddr_ipx_size
    xchg ebx,eax
    pop eax
    mov word [$774fc],$333
    or ebx,ebx
    js .nosocket
    clc
    ret
.nosocket:
    _mov ax,$0ffff
    stc
    ret

send_packet:
    ; eax,dx = IPX address to send packet to
    ; ebp    = IPX network to send packet to
    mov dword [addr+sockaddr_ipx.node],eax
    mov word [addr+sockaddr_ipx.node+4],dx
    mov dword [addr+sockaddr_ipx.network],ebp
    call calc_checksum
    mov [esi],ebx
    mov ebx,$0ed08a
    add ebx,[varedxxx_offset]
    movzx eax,word [ebx]
    _add ebx,2 ; Place $0ed08c in ebx
    sys_sendto eax,ebx,64,0,addr,sockaddr_ipx_size
    ret

receive_packet:
    mov ebx,$0ed08a
    add ebx,[varedxxx_offset]
    movzx eax,word [ebx]
    _add ebx,2 ; Place $0ed08c in ebx
    sys_recvfrom eax,ebx,64,MSG_DONTWAIT,addr,addr_size
    _cmp eax,0
    js .error
    ; Packet has been received
    call calc_checksum
    cmp [esi],ebx
    jne .error
    ; Save the host we received the packet from.
    mov esi,addr
    mov edi,$0ed0d2
    add edi,[varedxxx_offset]
    mov eax,[esi+sockaddr_ipx.network]
    mov [edi+10],eax
    mov eax,[esi+sockaddr_ipx.node]
    mov [edi],eax
    mov ax,[esi+sockaddr_ipx.node+4]
    mov [edi+4],ax
    ; Carry flag is already cleared by cmp [esi],ebx
    ret
.error:
    stc
    ret

;
; Close the socket in ax.
;

close_ipx_socket:
    cmp ax,-1
    je .exit
    cwde
    sys_close eax
.exit:
    ret


More information about the fpc-pascal mailing list