Starting out with winsock
-
- Posts: 649
- Joined: Jun 09, 2005 0:08
Starting out with winsock
I'm trying out some network code, udp using winsock. Currently I am just sending a few bytes between two programs.
I'm using recvfrom(socket,buffer.......) to recieve the data but it waits for data to be sent, is there a way to check if there's any data to be recieved that doesn't wait if there's no data?
I'm using recvfrom(socket,buffer.......) to recieve the data but it waits for data to be sent, is there a way to check if there's any data to be recieved that doesn't wait if there's no data?
Re: Starting out with winsock
Check TSNE (search forum).Stonemonkey wrote:... is there a way to check if there's any data to be recieved that doesn't wait if there's no data?
Re: Starting out with winsock
Yes, with socket select or using non-blocking with fcntl.
I'll post an example of socket select in a minute. --> see: http://www.freebasic.net/forum/viewtopi ... 6&start=14
edit: Or use threads. So the the thread waits for a packet and not the main loop.
I'll post an example of socket select in a minute. --> see: http://www.freebasic.net/forum/viewtopi ... 6&start=14
edit: Or use threads. So the the thread waits for a packet and not the main loop.
-
- Posts: 8586
- Joined: May 28, 2005 3:28
- Contact:
Re: Starting out with winsock
Yes socket select is the key. (of course on linux too)
None blocking sockets are a bad idea.
Joshy
None blocking sockets are a bad idea.
Joshy
-
- Posts: 649
- Joined: Jun 09, 2005 0:08
Re: Starting out with winsock
Thanks for that. I'm not really wanting to go the route of threads at the moment badidea.
Re: Starting out with winsock
why? i'd say blocking is a bad idea for anything non-basicD.J.Peters wrote:Yes socket select is the key. (of course on linux too)
None blocking sockets are a bad idea.
Joshy
other than that the sockets could die at any time, for any reason, it's just way better design :)
i wish they never made blocking sockets to begin with
Re: Starting out with winsock
You can just put your blocking socket function in a thread and kill it if it times out.
-Vince
-Vince
Re: Starting out with winsock
i know, i'm just not a big fan of spamming threads.. but it\s what everyone else does
it''s annoying, and cheap programming, but for personal purposes its quite ok =)
http://fbcraft.fwsnet.net/threads.jpg
one example: tortoiseSVN which does absolutely nothing, has 30 threads
in contrast, FBedit uses 2 threads
it''s annoying, and cheap programming, but for personal purposes its quite ok =)
http://fbcraft.fwsnet.net/threads.jpg
one example: tortoiseSVN which does absolutely nothing, has 30 threads
in contrast, FBedit uses 2 threads
-
- Posts: 8586
- Joined: May 28, 2005 3:28
- Contact:
Re: Starting out with winsock
Hello Gonzo
you can do all your network needs with sleep and threads. (what a nice rhyme)
but ten beears sorry years later come back and proof it again ;-)
Joshy
you can do all your network needs with sleep and threads. (what a nice rhyme)
but ten beears sorry years later come back and proof it again ;-)
Joshy
-
- Posts: 134
- Joined: Apr 19, 2007 16:20
- Contact:
Re: Starting out with winsock
I need a servercode for my programm. At time, my server is not very good working with wsaasyncselect.
Is this code realy working?
My socketserver works without threads, because I work with shared variables.
To look what my server ist doing, you can look here:
http://www.doko-lounge.de (In german)
My server is written in GFA Basic and works not very vell.
So I need a better Server code.
Is the freebasic-code better?
@D.J.Peters in german: Kannst du mir evtl. beim Socketserver helfen? Mein GFA Server läuft mit GFA Basic mit WSAAsyncselect und läuft nicht wirklich "rund". Ich kann dir gerne meinen Code senden.
Ich weiss nicht wie man hier PMs schreibt, deshalb schreibe ich es so.
My email: hilfe@doko-lounge.de
Thank you :-)
Stevie
Is this code realy working?
Code: Select all
#include "network.bi"
#include "fbgfx.bi"
#DEFINE SERVER_PORT 27015
#DEFINE CLIENT_IP "127.0.0.1"
'--- SERVER ---
dim as SOCKET socketId
dim as sockaddr_in clientAddr
dim as sockaddr_in serverAddr
dim as integer serverAddrSize = sizeof(serverAddr)
dim as integer clientAddrSize = sizeof(clientAddr)
dim as integer iResult, quit, sendData, sendCount
dim as string key
dim as net_data netDataIn
dim as net_data netDataOut
dim as fd_set readfds, readfds0
dim as fd_set writefds, writefds0
dim as timeval timeout
iResult = init_socket_API()
if (iResult <> 0) then
print "Winsock init: Error"
sleep
end
end if
socketId = socket_(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
if (socketId < 0) then
print "Socket: Error"
close_socket_API()
end
end if
serverAddr.sin_family = AF_INET
serverAddr.sin_port = htons(SERVER_PORT)
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY)
iResult = bind(socketId, cptr(sockaddr ptr, @serverAddr), serverAddrSize)
if (iResult < 0) then
print "Bind: Error"
close_socket_API()
sleep
end
end if
clientAddr.sin_family = AF_INET
clientAddr.sin_port = htons(SERVER_PORT)
clientAddr.sin_addr.s_addr = inet_addr(CLIENT_IP)
FD_ZERO(@readfds0)
FD_ZERO(@writefds0)
FD_SET_(socketId, @readfds0)
FD_SET_(SocketId, @writefds0)
print "q = quit"
print "s = send"
while (quit = 0)
quit = 0: sendData = 0
key = lcase(inkey())
if (key = "q") then quit = 1
if (key = "s") then sendData = 1
'Keep a backup because SelectSocket will change the data
readfds = readfds0
writefds = writefds0
timeout = type(0, 0)
iResult = selectSocket(FD_SETSIZE, @readfds, @writefds, NULL, @timeout)
if (iResult = 0) then
print "SelectSocket: Timeout"
elseif (iResult < 0) then
print "SelectSocket: Error"
else
'print "SelectSocket: Sockets ready: "; iResult
end if
if(sendData = 1) then
netDataOut.seqNr = sendCount
netDataOut.text = "Server says: No!"
if(FD_ISSET(socketId, @writefds)) then
print "Send: Trying..."
iResult = sendto(socketId, cptr(ubyte ptr, @netDataOut), _
sizeof(net_data), 0, cptr(sockaddr ptr, @clientAddr), clientAddrSize)
if (iResult < 0) then
print "Send: Error"
closeSocket(socketId)
close_socket_API()
sleep
end
else
print "Bytes send:"; iResult;
print " to: "; inet_addr_rev(clientAddr.sin_addr)
end if
end if
sendCount += 1
end if
if(FD_ISSET(socketId, @readfds)) then
print "Receive: Trying..."
iResult = recvfrom(socketId, cptr(ubyte ptr, @netDataIn), _
sizeof(net_data), 0, cptr(sockaddr ptr, @clientAddr), @clientAddrSize)
if (iResult > 0) then
print "Bytes received:"; iResult;
print " from: "; inet_addr_rev(clientAddr.sin_addr)
print "SeqNr: "; netDataIn.seqNr;
print " text: "; netDataIn.text
elseif (iResult = 0) then
print "Receive: Connection closed"
closesocket(socketId)
close_socket_API()
sleep
end
else
print "Receive: Error"
closesocket(socketId)
close_socket_API()
sleep
end
end if
end if
sleep 1, 1
wend
iResult = closesocket(socketId)
if (iResult < 0) then
print "CloseSocket: Error"
end if
close_socket_API()
print "End."
sleep
To look what my server ist doing, you can look here:
http://www.doko-lounge.de (In german)
My server is written in GFA Basic and works not very vell.
So I need a better Server code.
Is the freebasic-code better?
@D.J.Peters in german: Kannst du mir evtl. beim Socketserver helfen? Mein GFA Server läuft mit GFA Basic mit WSAAsyncselect und läuft nicht wirklich "rund". Ich kann dir gerne meinen Code senden.
Ich weiss nicht wie man hier PMs schreibt, deshalb schreibe ich es so.
My email: hilfe@doko-lounge.de
Thank you :-)
Stevie
-
- Posts: 8586
- Joined: May 28, 2005 3:28
- Contact:
Re: Starting out with winsock
@Stevie
I can't help ATM but here you will get it self (i'm sure)
in german: http://www.zotteljedi.de/socket-tipps/s ... genau.html
all other socket topics: http://www.zotteljedi.de/socket-tipps/
Joshy
I can't help ATM but here you will get it self (i'm sure)
in german: http://www.zotteljedi.de/socket-tipps/s ... genau.html
all other socket topics: http://www.zotteljedi.de/socket-tipps/
Joshy