Youness Alaoui wrote:


2009/4/1 Stéphane Bisinger <stephane.bisin...@gmail.com <mailto:stephane.bisin...@gmail.com>>

    Hi,

Hello Mark! Welcome to the mailing list! :)


    2009/4/1 Mark Lagendijk <mar...@marksspeelhoekje.nl
    <mailto:mar...@marksspeelhoekje.nl>>:
    > Since I hated the adds and looks of msn messenger, I switched to
    aMSN a few
    > years ago. I have been an enthusiastic user since. Around a half
    year ago I
    > saw the blogpost of one of the developers about aMSN 2. I
    thought it would
    > be fun to start contributing, but since there was only a
    'getting started'
    > guide for Linux I lost interest and forgot all about it.

    It is nice to know that some people prefer aMSN to the official
    client!

    > A month ago I
    > searched for a Windows guide again, but it still wasn't there. I
    then
    > decided to make this guide myself, afterall it couldn't be any
    harder than
    > getting the amsn2 code, installing python and maybe a few other
    things.
    > These 'few other things' turned out to be quite a few (see my
    post on the
    > forums:
    http://www.amsn-project.net/forums/viewtopic.php?p=37552#37552 ), so
    > it took me around a day to get it working.

    Well I think it is an average time when you have to figure out "few
    other things" to get started, hopefully your experience will shorten
    this time for other users!

    > It was then that I found out that I couldn't log in. I spoke
    with a few
    > developpers on the irc channel, and said that I would fix the
    bug myself.
    >
    > There turned out to be 2 bugs:
    > The first bug is that the socket object has the status 'OPEN',
    but in fact
    > isn't open at all. This means there is a bug in the sock class
    (or one of
    > its super classes) of the 'gnet' module of pymsn. I spend some
    time trying
    > to analyse this bug. I found out the following:
    >
    > The actual opening of the socket returns the 'EWOULDBLOCK' error
    code (line
    > 99 of 'iochannel.py':   err = self._transport.connect_ex((host,
    port)   ).
    > Might this be the problem? In the code this error is handled the
    same as no
    > error: the status is set to 'OPEN'.
    > The bug doesn't occur when opening 'test.py' from pymsn. Has
    this anything
    > to do with some sort of threading? (I am new to python and don't
    know if it
    > has threading, or how it uses it). I do not know why it works in
    test.py and
    > not in aMSN2, but I do know that the socket object it self is
    responsible
    > for making sure that it is really open when it says it is.
    > When I put a 'sleep' of 1 second in the 'post open' function the
    bug didn't
    > occur anymore.

    First of all I must say that I know close to nothing about the
    internals of PyMSN so I'll give you some general advice on how to find
    an answer on your own: first of all I'd try to find out what an
    EWOULDBLOCK error code means. Then you could dive into the amsn2 code
    to see how it handles connecting and how it is different from test.py.
    This has 2 advantages: first you familiarize with the code, and second
    you could find a way to reproduce this bug in a simple test (for
    instance by modifying test.py). If you achieve that, you can have a
    better understanding of the issue and could figure out if it's a PyMSN
    bug or an amsn2 one.

Good advice, but I did that allready. The problem was I got stuck and didn't know if I was fixing the symptoms or the problem itself.

    As for threading, Python has its own threading implementation, but it
    is an internal rewrite of threads and so it basically doesn't work
    with C extensions. We are using Gobject's implementation for
    threading, you may want to check that out to get a better
    understanding.

I will check it out when I have the time.
Well, EWOULDBLOCK is easy, it's because the socket is in 'non-blocking' mode, which means when you do a 'connect' or 'send' or 'recv' it will not block until the operation is completed.. the error EWstablished, it woulOULDBLOCK means exactly what it says, it means that the operation WOULD BLOCK if the socket was not non-blocking.. in other words, if you do a 'connect', the error EWOULDBLOCK means "there was no error, but the connection has not yet been ed block if you wanted it to finish connecting, so just wait and ask me later if i finished connecting" which basically translates to "the socket is not yet OPEN, I will notify you when it actually does become OPEN". So the state of the socket should go into a 'CONNECTING' state before going into OPEN state and listen to the socket events to figure out when it becomes OPEN (usually a 'writable' event means that the connection has been completed). The sleep 1 is what makes the difference, you force it to wait until the TCP connection finishes being set up!
That's what I thought. I wasn't sure though and it is frustrating to try to fix something when you have
About threading I don't know and I don't think so.. look at amsn2/protocol/protocol.tcl and compare it with test.py, but I don't think there is much difference.. I think the only difference is maybe that test.py is slower for some reason by doing some processing, so by the time it finishes, the socket was already done connecting.
O



    > The second bug occurs in both aMSN 2 and test.py.
    >
    > Only one package (2048 bytes) from the soapresponse is read.
    After this the
    > socket closes. Should the socket stay open? Or should it close,
    but first
    > pass the data it received?
    >
    > When I also use a workaround for this (changing the 2048 bytes
    to 8000, so
    > the first package contains the whole response) I am able to log
    in and chat.
    >
    > Is there anyone (who knows the ins and outs of sockets), who can
    fix these
    > bugs, or point me in the right direction?

    Sockets on windows are quite different from sockets on *nix so there
    could be a difference in behaviour in Python too. You should check
    with the documentation about the sockets and see if you can find
    something about this. If on *nix systems logging in works it means
    that we are receiving the whole data, hence the logic should be there.
    You'd have to find where and why it stops on windows (it would also
    help to find out if it's something that happens on every windows box
    or it's just on yours).

This also seems like a simple issue!
Actually the server sends you the response then closes the socket.. I'm guessing that on linux you get a 'readable' followed by a 'closed' event.. but on windows you get the 'closed' event as soon as it happens.. so what pymsn does is that when it gets the 'closed' event, it closes everything and thinks it's done.. the solution would be to do something like :
if event = 'closed':
   if socket.data_is_available():
       buffer += socket.read_all_remaining_data()
    process_close()
(this is of course pseudo code)
When your socket is closed, just make pymsn read whatever the system stored in its buffer before closing the socket locally, so you don't miss anything! This should fix it!
Actually I did do exactly this at some time, but then I thought: "if the socket doesn't close on Linux, it shouldn't close on Windows" and I concluded that I was fixing a symtom instead of the problem itself. So I will only have to do that fix again.



    Workarounds like yours are fine, but a full understanding of the issue
    would be advisable: it leads to better solutions.

Actually, I disagree.. workarounds are fine for TESTING, but I would REALLY like aMSN2 to be as clean as possible, no hacks anywhere! And I know that Ali Sabil (original pymsn author) wrote the whole pymsn library with exactly this idea in mind, he did a lot of engineering to make sure there would be no hacks anywhere in the code, so trying to fix the thing correctly is the best solution... I think my tips above should help you enough in fixing this!
I agree, I never meant the workarounds as fixes, just as a means to find the problem.


    I hope I could help you a little on your way to find your own answers
    ;) Hopefully there is someone who knows better than me and will help
    you further.

Thanks Stephane, I hope both our answers were helpful for him!
Thank you from me too. You gave good advice on how to get at the bottom of those bugs. I did allready do what you suggested, though (except the part about threading), but you couldn't know that since I didn't say so ;).
Anyways, Mark, I don't know if I already took the time to thank you for what you're doing! I hope you best of luck and thanks for contributing! :)
KaKaRoTo
Thanks! And thanks for your tips. Now I know where the problems ly and how I can fix them.
Mark


    --
    Stéphane

    
------------------------------------------------------------------------------
    _______________________________________________
    Amsn-devel mailing list
    Amsn-devel@lists.sourceforge.net
    <mailto:Amsn-devel@lists.sourceforge.net>
    https://lists.sourceforge.net/lists/listinfo/amsn-devel


------------------------------------------------------------------------

------------------------------------------------------------------------------
------------------------------------------------------------------------

_______________________________________________
Amsn-devel mailing list
Amsn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amsn-deve
------------------------------------------------------------------------------
_______________________________________________
Amsn-devel mailing list
Amsn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amsn-devel

Reply via email to