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.

Reply via email to