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 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