Thanks for everyone's help with this. I've never actually used non-blocking sockets before so that side of things is new to me, but I'm pretty sure with all the adivce and examples posted here I'll be able to get things/something working now. Websockify sounds like it'll be very useful here too.
> I think your best bet is to integrate HumbleNet, I want to get 'real' sockets going as my project is a programming language that translates to c++ (and emscripten) and I want to provide users with something as much like 'normal' sockets as possible. But once I do get sockets going, I might look into adding HumbleNet as a 'module'. On Wed, Dec 6, 2017 at 7:58 PM, Floh <[email protected]> wrote: > Things like "EINPROGRESS" or "EWOULDBLOCK" are not actually errors, but > like status reports of the non-blocking socket that it doesn't have > anything useful to report yet because an asynchronous operation is still in > progress. E.g. when connecting on a non-blocking, the connect() function > will most likely return immediately with a SOCKET_ERROR and EINPROGRESS, > this means the connection process is underway. At some later time, the > select() call will return that writing is possible, this means the > connection has finished and the socket is ready for operation. > > Those details for non-blocking socket are a bit hidden in the > documentation (e.g. http://man7.org/linux/man-pages/man2/connect.2.html). > > I think your best bet is to integrate HumbleNet, since it should hide all > those details under a more convenient interface. > > Cheers, > -Floh > > On Tuesday, 5 December 2017 20:40:50 UTC+1, Mark Sibly wrote: >> >> Thanks very much for that, although I can't actually build/test it - >> NetClientSetup at least is missing. >> >> It did inspire me to add set the socket O_NONBLOCK flag in my own code, >> but it doesn't seem to help, I'm still get errno 15 'in progress' error. >> >> But looking at your code, doConnect() actually appears to treat connect >> errors as successes if the error happened to be 'in progress' (and others)! >> In fact, doConnect *only* succeeds if it fails! >> >> I guess that sort of makes sense, but I am feeling quite out of my depth >> here and aren't really sure how to proceed. I am having trouble picturing >> the exact setup (servers, websockify? etc) involved in simply allowing 2 >> players to be able to play against each other online, which is all I really >> want to achieve. Do I need websockify for this? What does the sever run? >> etc. >> >> >> >> >> On Wed, Dec 6, 2017 at 2:11 AM, Floh <[email protected]> wrote: >> >>> Here's a quick'n'dirty example client which works across >>> emscripten/Windows/OSX/Linux: >>> >>> https://gist.github.com/floooh/360e884ea45c9868039c9ddb1343750d >>> >>> This assumes that messages are text and separated by a '\r'. >>> >>> The only interesting parts are (a) the socket must be non-blocking, also >>> during connecting, and (b) uses select to check if the socket is ready for >>> reading and writing >>> >>> On the server side you need to use WebSocket proxy which the emscripten >>> client connects to (so you need 2 ports if you want both native and HTML5 >>> clients to connect, one "raw" TCP port for the native clients, and one >>> WebSocket port for the HTML5 clients). >>> >>> Websockify is such a proxy solution, but I used a Go server with Gorilla >>> websocket instead (http://www.gorillatoolkit.org/pkg/websocket) >>> >>> The main difference between TCP and WebSocket is that WebSocket does >>> message-framing (so one send will result in one recv with the complete data >>> on the other side, while in TCP you send and receive a stream of data and >>> need to re-assemble complete messages on the other side). >>> >>> If you want a solution that works both native and with HTML5 I would >>> recommend to ignore the WebSocket message framing and treat both ends like >>> a normal TCP stream (with your own message framing). >>> >>> You should also give HumbleNet a try, I haven't used this yet because it >>> was a bit too late: https://github.com/HumbleNet/HumbleNet >>> >>> Cheers, >>> -Floh. >>> >>> On Tuesday, 5 December 2017 10:12:06 UTC+1, Mark Sibly wrote: >>>> >>>> Thanks for the reply, good to know at least someone has them working! >>>> >>>> Does my connect code look OK? >>>> >>>> How should the hostname look? >>>> >>>> If I use "monkeycoder,co.nz" I am getting errno=115 ('in progress') >>>> after connect fails. >>>> >>>> If I use "http://monkeycoder.co.nz" I am getting errno=113 ('no route >>>> to host') after connect fails. >>>> >>>> I have also tried "ws://demos.kaazing.com" and "demos.kaazing.com" >>>> with the same result. >>>> >>>> What is 'websockify'? At this point, I'm not actually trying to >>>> send/receive data, just trying to connect. Will I need websockify for this? >>>> I am on Windows 10, does websockify even run on this? >>>> >>>> On Tuesday, December 5, 2017 at 4:00:20 PM UTC+13, caiiiycuk wrote: >>>>> >>>>> I've use linux sockets with emscripten. They work as in native code >>>>> except one thing - they should be async. So if you app use async socket >>>>> then it should work out the box. Ofcourse you should wrap server socket >>>>> with websockify it's work like a charm. >>>>> >>>>> 5 дек. 2017 г. 8:21 ДП пользователь "Mark Sibly" <[email protected]> >>>>> написал: >>>>> >>>>>> Hi, >>>>>> >>>>>> I am completely new to emscipten sockets and am wondering how they >>>>>> work and what to expect. >>>>>> >>>>>> I understand they are built on top of websockets, but I always >>>>>> thought websockets were SendMsg/RecvReply based - how does that work? >>>>>> >>>>>> Do you have to use threads if you want to 'block' on an emscripten >>>>>> socket without blocking the entire app? Is this recommended or is it best >>>>>> to just 'poll' via, say, ioctlsocket with FIONREAD. Can you poll with >>>>>> select? >>>>>> >>>>>> Should I at least be able to connect to TCP port 80 of my http >>>>>> website? I have so far been unable to perform a simple connect and wonder >>>>>> if it's even possible? I'm not expecting to be able to perform an http >>>>>> GET >>>>>> - although perhaps that is possible? >>>>>> >>>>>> My connect code is ipv6-ish, ie: >>>>>> >>>>>> int _connect( const char *hostname,const char *service ){ >>>>>> >>>>>> addrinfo hints; >>>>>> memset( &hints,0,sizeof( hints ) ); >>>>>> >>>>>> hints.ai_family=AF_UNSPEC; >>>>>> hints.ai_socktype=SOCK_STREAM; >>>>>> hints.ai_protocol=IPPROTO_TCP; >>>>>> if( hostname && !hostname[0] ) hostname=0; >>>>>> >>>>>> addrinfo *pres=0; >>>>>> if( ::getaddrinfo( hostname,service,&hints,&pres ) ) return -1; >>>>>> int sock=-1; >>>>>> for( addrinfo *res=pres;res;res=res->ai_next ){ >>>>>> sock=::socket( res->ai_family,res->ai_socktype,res->ai_protocol ); >>>>>> if( sock==-1 ) continue; >>>>>> >>>>>> if( !connect( sock,res->ai_addr,res->ai_addrlen ) ) break; >>>>>> ::closesocket( sock ); >>>>>> sock=-1; >>>>>> } >>>>>> freeaddrinfo( pres ); >>>>>> return sock; >>>>>> } >>>>>> >>>>>> This works on windows, macos and linux (ie: I can connect any TCP >>>>>> port 80) but not emscripten - the connect always fails. Should I revert >>>>>> to >>>>>> the pre-ipv6 way of connecting? I did give this a quick try but with no >>>>>> luck. >>>>>> >>>>>> Any clues most welcome! >>>>>> >>>>>> Bye, >>>>>> Mark Sibly >>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "emscripten-discuss" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "emscripten-discuss" group. >>> To unsubscribe from this topic, visit https://groups.google.com/d/to >>> pic/emscripten-discuss/3oyVuc8kY2c/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "emscripten-discuss" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/emscripten-discuss/3oyVuc8kY2c/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
