Sorry I miss first line in connection snippet:
printf("SocketLoader trying to connect protocol(%d) socktype(%d)
'%s'\n", aip->ai_socktype, aip->ai_protocol, socketAddress.c_str());
socketId = socket(aip->ai_family, aip->ai_socktype /*|
SOCK_NONBLOCK*/, aip->ai_protocol);
int flags;
if ((flags = fcntl(socketId, F_GETFL, 0)) < 0) {
abort();
}
if (fcntl(socketId, F_SETFL, flags | O_NONBLOCK) < 0) {
abort();
}
if (socketId >= 0) {
if (connect(socketId, aip->ai_addr, aip->ai_addrlen) < 0) {
if (errno != EINPROGRESS) {
return false;
}
}
return;
}
abort();
2017-12-06 12:21 GMT+07:00 Александр Гурьянов <[email protected]>:
> I've use common internet address like '192.168.0.104:7014' and connect
> to socket in this way:
>
> int flags;
> if ((flags = fcntl(socketId, F_GETFL, 0)) < 0) {
> abort();
> }
> if (fcntl(socketId, F_SETFL, flags | O_NONBLOCK) < 0) {
> abort();
> }
>
>
> if (socketId >= 0) {
> if (connect(socketId, aip->ai_addr, aip->ai_addrlen) < 0) {
> if (errno != EINPROGRESS) {
> return false;
> }
> }
> return;
> }
>
> abort();
>
>
> After socket is connected I send and receive data in this way:
>
> fd_set fdr;
> fd_set fdw;
> int res;
>
> FD_ZERO(&fdr);
> FD_ZERO(&fdw);
> FD_SET(loader->socketId, &fdr);
> FD_SET(loader->socketId, &fdw);
> res = select(64, &fdr, &fdw, NULL, NULL);
>
> and then I use write(socketId, buf, num) or read(socketId, buf, num)
> depends on flags and protocol logic.
>
> This socket code will work in native envrinoment on linux. So I can
> test client/server communication through native tools (debugger).
> After that when client and server works fine I go to next step,
> running websockfiy. For example native server works on port 7014, then
> I start proxing this port with websockify to 7015:
>
> websockify -v 192.168.0.104:7014 192.168.0.104:7015
>
> Emscripten version will work on 7015 port (you should connect to 7015
> in emscripten version and to 7014 in native version). Usually this
> steps is enough to get worked solution.
>
>
> P.S. For nonblocking mode is correct to get EINPROGRESS it's expected
> behaviour.
>
> 2017-12-06 2:40 GMT+07:00 Mark Sibly <[email protected]>:
>> 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/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.
--
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.