Author |
Topic: Sockets (Read 262 times) |
|
KenDown
Full Member
member is offline
Posts: 181
|
|
Sockets
« Thread started on: Dec 6th, 2017, 3:15pm » |
|
What I want to do is send a key-press from my programming running on one computer to a similar program running on another computer. Back in the days when Richard was still here he suggested that I needed to learn socket programming and I've finally got around to trying out his advice.
I use PROC_initialisesockets on both computers then FN_tcpconnect on the sending computer and FN_tcplisten on the receiving one followed by FN_check_connection. I set up a buffer on both and then use FN_writelinesocket on the sender and FN_readsocket on the receiver.
Not knowing any better, I'm using port 25 on both.
The sender says that everything is fine and does what it is supposed to do; the receiver can't get past FN_check_connection.
Any advice would be gratefully received.
|
|
Logged
|
|
|
|
DDRM
Administrator
member is offline
Gender:
Posts: 321
|
|
Re: Sockets
« Reply #1 on: Dec 11th, 2017, 08:01am » |
|
Hi Kendall,
I'm not ignoring you, but I haven't answered because I can't make it work! Possibly because I was trying on a computer which is working through a proxy server and my laptop, connected to a separate wireless network.
Could you post your basic code as a starting point? Obviously replace all explicit machine names/IP addresses with placeholders.
The only thing I can suggest offhand is using port 23 (Telnet) or 80 (HTTP) instead of port 25 (SMTP). FTP is port 21, which might also be worth a go.
Best wishes,
D
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline
Posts: 181
|
|
Re: Sockets
« Reply #2 on: Dec 11th, 2017, 2:52pm » |
|
That's very kind of you. Here are the two programs.
REM Program to send a message via socket programming REM Alter the variable query$ in PROCfindname to the network REM name of the receiving computer
INSTALL@lib$+"SOCKLIB" PROC_initsockets host$=FN_gethostname PRINThost$ hostent%=FN_sethost(host$) hostip%=!!hostent%!12 PRINTFNipaddrs(hostip%)
PROCfindname
REPEAT socnum%=FN_tcpconnect(dest$,"25") UNTILsocnum%>0 PRINT"Peer name: "FN_getpeername(socnum%)
PRINT"Connection established: "socnum%
DIMbuffer%256 ?buffer%=7
try%=0 REPEAT success%=FN_writesocket(socnum%,buffer%,1) PRINTsuccess% try%+=1 UNTILtry%=10
try%=0 REPEAT success%=FN_writelinesocket(socnum%,CHR$7) PRINTsuccess% try%+=1 UNTILtry%=10
PROC_exitsockets END : DEFFNipaddrs(addr%) =STR$(addr%AND255)+"."+STR$(addr%>>>8AND255)+"."+STR$(addr%>>>16AND255)+"."+STR$(addr%>>>24AND255) : DEFPROCfindname SYS"LoadLibrary","dnsapi.dll"TOdnsapi% SYS"GetProcAddress",dnsapi%,"DnsQuery_A"TO`DnsQuery` SYS"GetProcAddress",dnsapi%,"DnsRecordListFree"TO`DnsRecordListFree`
DIMdnsr{pNext%,pName%,wType{l&,h&},wDataLength{l&,h&},dwFlags%,dwTtl%,dwReserved%,dwData%}
query$="Computer2"
SYS`DnsQuery`,query$,1,1,0,dnsr{},0 rr%=dnsr.pNext%
WHILEdnsr.pNext% !(^dnsr{}+4)=dnsr.pNext% PRINT$$dnsr.pName% " ",FNipaddrs(dnsr.dwData%) ENDWHILE dest$=FNipaddrs(dnsr.dwData%) SYS`DnsRecordListFree`,rr%,0 SYS"FreeLibrary",dnsapi% ENDPROC
==================
REM Program to receive a message via socket programming REM Alter the variable query$ in PROCfindname to the network REM name of the sending computer
INSTALL@lib$+"SOCKLIB" PROC_initsockets host$=FN_gethostname PRINThost$ hostent%=FN_sethost(host$) hostip%=!!hostent%!12 PRINTFNipaddrs(hostip%)
PROCfindname
PRINT"Checking connection" REPEAT socnum%=FN_tcplisten(host$,"25") UNTILsocnum%>0
PRINT"Connection established" REPEAT success%=FN_check_connection(socnum%) PRINTFN_getpeername(success%) g%=INKEY(10) UNTILsuccess%>0ORg%=13
PRINTsuccess%" Connection checked"
DIMbuffer%256
REPEAT inbyte%=FN_readsocket(success%,buffer%,1) PRINTinbyte% g%=INKEY(2) UNTILinbyte%>0ORg%=13
VDU?buffer%
PROC_exitsockets END : DEFFNipaddrs(addr%) =STR$(addr%AND255)+"."+STR$(addr%>>>8AND255)+"."+STR$(addr%>>>16AND255)+"."+STR$(addr%>>>24AND255) : DEFPROCfindname SYS"LoadLibrary","dnsapi.dll"TOdnsapi% SYS"GetProcAddress",dnsapi%,"DnsQuery_A"TO`DnsQuery` SYS"GetProcAddress",dnsapi%,"DnsRecordListFree"TO`DnsRecordListFree`
DIMdnsr{pNext%,pName%,wType{l&,h&},wDataLength{l&,h&},dwFlags%,dwTtl%,dwReserved%,dwData%}
query$="Computer1"
SYS`DnsQuery`,query$,1,1,0,dnsr{},0 rr%=dnsr.pNext%
WHILEdnsr.pNext% !(^dnsr{}+4)=dnsr.pNext% PRINT$$dnsr.pName% " ",FNipaddrs(dnsr.dwData%) ENDWHILE dest$=FNipaddrs(dnsr.dwData%) SYS`DnsRecordListFree`,rr%,0 SYS"FreeLibrary",dnsapi% ENDPROC
Provided a valid network name is put in the sending program it will return values showing that the messages have been sent successfully.
Even with a valid network name in the receiving program, it hangs at the point of checking the connection.
|
|
Logged
|
|
|
|
sveinioslo
Developer
member is offline
Posts: 64
|
|
Re: Sockets
« Reply #3 on: Dec 17th, 2017, 08:58am » |
|
Hi.
Made the necessary changes to your programs. It's easier if you send something printable. Notice the difference on the receiver end when you send at full speed.(REMout WAIT 25) If you use the ide's close button to stop your program, then you will need to close and reopen the ide. Your program is likely to fail otherwise. Socklib is VERY sensitive to proper handling. Watch out for windows firewall and other security software, they might interfere. Have not checked the dns part.
Svein
The sender. Code:
INSTALL@lib$+"SOCKLIB"
PROC_initsockets
host$=FN_gethostname
PRINThost$
hostent%=FN_sethost(host$)
hostip%=!!hostent%!12
PRINTFNipaddrs(hostip%)
ON CLOSE PROC_exitsockets : QUIT : REM important
ON ERROR PROC_exitsockets : REPORT : END : REM important
PROCfindname
dest$=host$ : REM if testing locally
REPEAT
socnum%=FN_tcpconnect(dest$,"12325")
UNTILsocnum%>0
PRINT"Peer name: "FN_getpeername(socnum%)
PRINT"Connection established: "socnum%
DIMbuffer%255
PRINT "Sending bytes"
try%=0
REPEAT
?buffer%=48+try% : REM Printable bytes
PRINT try% : WAIT 25 : REM
success%=FN_writesocket(socnum%,buffer%,1)
try%+=1
UNTILtry%=10
success%=FN_writelinesocket(socnum%,"") : REM newline
PRINT "Sending lines"
try%=0
REPEAT
PRINT try% : WAIT 25 : REM
success%=FN_writelinesocket(socnum%,"Hello"+STR$(try%))
try%+=1
UNTILtry%=10
PROC_closesocket(socnum%) : REM close before exit
PRINT "Finished"
PROC_exitsockets
END
:
DEFFNipaddrs(addr%)
=STR$(addr%AND255)+"."+STR$(addr%>>>8AND255)+"."+STR$(addr%>>>16AND255)+"."+STR$(addr%>>>24AND255)
:
DEFPROCfindname
SYS"LoadLibrary","dnsapi.dll"TOdnsapi%
SYS"GetProcAddress",dnsapi%,"DnsQuery_A"TO`DnsQuery`
SYS"GetProcAddress",dnsapi%,"DnsRecordListFree"TO`DnsRecordListFree`
DIMdnsr{pNext%,pName%,wType{l&,h&},wDataLength{l&,h&},dwFlags%,dwTtl%,dwReserved%,dwData%}
query$="Computer2"
SYS`DnsQuery`,query$,1,1,0,dnsr{},0
rr%=dnsr.pNext%
WHILEdnsr.pNext%
!(^dnsr{}+4)=dnsr.pNext%
PRINT$$dnsr.pName% " ",FNipaddrs(dnsr.dwData%)
ENDWHILE
dest$=FNipaddrs(dnsr.dwData%)
SYS`DnsRecordListFree`,rr%,0
SYS"FreeLibrary",dnsapi%
ENDPROC
The receiver. Code:
INSTALL@lib$+"SOCKLIB"
PROC_initsockets
host$=FN_gethostname
PRINThost$
hostent%=FN_sethost(host$)
hostip%=!!hostent%!12
PRINTFNipaddrs(hostip%)
ON CLOSE PROC_exitsockets : QUIT : REM important
ON ERROR PROC_exitsockets : REPORT : END : REM important
PROCfindname
PRINT"Checking connection"
REPEAT
socnum%=FN_tcplisten(host$,"12325")
IF socnum%<0 THEN PRINT FN_socketerror
UNTILsocnum%>0
PRINT"Listening"
REPEAT
success%=FN_check_connection(socnum%)
WAIT 0
UNTILsuccess%>0
PRINT "Connected to "FN_getpeername(success%)
REM buffer content need to be parsed
DIMbuffer%255
REPEAT
inbyte%=FN_readsocket(success%,buffer%,255)
IF inbyte%>0 THEN
PRINT "Received ";inbyte%;" bytes"
FOR I%=0 TO inbyte%-1
PRINT CHR$buffer%?I%;
NEXT
ELSE
WAIT 0
ENDIF
UNTIL inbyte%=-1
PRINT "Disconnected"
PROC_exitsockets
END
:
DEFFNipaddrs(addr%)
=STR$(addr%AND255)+"."+STR$(addr%>>>8AND255)+"."+STR$(addr%>>>16AND255)+"."+STR$(addr%>>>24AND255)
:
DEFPROCfindname
SYS"LoadLibrary","dnsapi.dll"TOdnsapi%
SYS"GetProcAddress",dnsapi%,"DnsQuery_A"TO`DnsQuery`
SYS"GetProcAddress",dnsapi%,"DnsRecordListFree"TO`DnsRecordListFree`
DIMdnsr{pNext%,pName%,wType{l&,h&},wDataLength{l&,h&},dwFlags%,dwTtl%,dwReserved%,dwData%}
query$="Computer1"
SYS`DnsQuery`,query$,1,1,0,dnsr{},0
rr%=dnsr.pNext%
WHILEdnsr.pNext%
!(^dnsr{}+4)=dnsr.pNext%
PRINT$$dnsr.pName% " ",FNipaddrs(dnsr.dwData%)
ENDWHILE
dest$=FNipaddrs(dnsr.dwData%)
SYS`DnsRecordListFree`,rr%,0
SYS"FreeLibrary",dnsapi%
ENDPROC
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline
Posts: 181
|
|
Re: Sockets
« Reply #4 on: Dec 17th, 2017, 1:43pm » |
|
Thanks. I'm going to have to study this, so please excuse the lack of an immediate full reply.
|
|
Logged
|
|
|
|
DDRM
Administrator
member is offline
Gender:
Posts: 321
|
|
Re: Sockets
« Reply #5 on: Dec 18th, 2017, 10:24am » |
|
Thanks, Svein.
I've been busy and unwell, so I haven't had a chance to look at either Kendall's programmes or your modified version.
Best wishes,
D
|
|
Logged
|
|
|
|
|