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] <javascript:>> > 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/topic/emscripten-discuss/3oyVuc8kY2c/unsubscribe >> . >> To unsubscribe from this group and all its topics, send an email to >> [email protected] <javascript:>. >> 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.
