Distributed Objects and Leopard issue

  • Does anyone have a workaround for the code below? This code worked
    great pre-Leopard.

    In order to get the server/client to work I had to switch the server
    code below to the single call:

    receivePort = [[NSSocketPort alloc] initWithTCPPort:8000];

    This allows the client to connect, but no longer allows me to modify
    the socket. The important modification is SO_REUSEADDR. Since I
    cannot do this anymore, if the user quits/force quits the
    applications, they have to wait 2+ minutes before restarting the
    application in order for the port to be available again.

    Using the current code below, the client can connect, and get the
    root proxy, but when you try to make a call to the root proxy an
    exception is thrown.

    Is this a bug in Leopard, or do I need to set things up another way
    with leopard?

    One last note, if the client is running on an OS that is pre-Leopard
    and the server is on Leopard, the connection works. The problem
    occurs when both are running on Leopard.

    Allan

    Server side:
    ----------------

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&serverAddress, 0, sizeof(serverAddress));
    serverAddress.sin_family        = AF_INET;
    serverAddress.sin_addr.s_addr    = htonl(INADDR_ANY); //need big-endian
    byte order
    serverAddress.sin_port            = htons(8000);

    fcntl( sockfd, F_SETFD, 1 );
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    timeToWait.tv_sec    = 30; // Timeout after n seconds...
    timeToWait.tv_usec    = 0;
    setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeToWait, sizeof
    (timeToWait));
    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeToWait, sizeof
    (timeToWait));
    bind(sockfd, (struct sockaddr *)&serverAddress, namelen);
    listen(sockfd, 10);

    receivePort = [[[NSSocketPort alloc] initWithProtocolFamily:PF_INET

    socketType:SOCK_STREAM

    protocol:0

    socket:sockfd] autorelease];

    theConnection = [[NSConnection alloc] initWithReceivePort:receivePort
    sendPort:nil];

    [theConnection setRootObject:self];

    Client side:
    ---------------

    sendPort = [[[NSSocketPort alloc] initRemoteWithTCPPort:8000
    host:hostName] autorelease];
    remoteConnection = [[NSConnection alloc] initWithReceivePort:nil
    sendPort:sendPort];
    remoteServerMgr = [remoteConnection rootProxy];
    [remoteServerMgr doSomething];
  • > receivePort = [[[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    >
    > socketType:SOCK_STREAM
    >
    > protocol:0
    >
    > socket:sockfd] autorelease];

    Is incorrect

    use

    receivePort = [[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    socketType:SOCK_STREAM protocol:IPPROTO_TCP socket:sockfd];

    instead. Note that protocol is not the same :)

    This fixed my problems on Leopard... Tiger was much more tolerant to
    this...

    Aurélien,
    Objective Decision Team

    On 27 nov. 07, at 00:26, Allan Dushan wrote:

    > Does anyone have a workaround for the code below? This code worked
    > great pre-Leopard.
    >
    > In order to get the server/client to work I had to switch the server
    > code below to the single call:
    >
    > receivePort = [[NSSocketPort alloc] initWithTCPPort:8000];
    >
    > This allows the client to connect, but no longer allows me to modify
    > the socket. The important modification is SO_REUSEADDR. Since I
    > cannot do this anymore, if the user quits/force quits the
    > applications, they have to wait 2+ minutes before restarting the
    > application in order for the port to be available again.
    >
    > Using the current code below, the client can connect, and get the
    > root proxy, but when you try to make a call to the root proxy an
    > exception is thrown.
    >
    > Is this a bug in Leopard, or do I need to set things up another way
    > with leopard?
    >
    > One last note, if the client is running on an OS that is pre-Leopard
    > and the server is on Leopard, the connection works. The problem
    > occurs when both are running on Leopard.
    >
    > Allan
    >
    >
    >
    > Server side:
    > ----------------
    >
    > sockfd = socket(AF_INET, SOCK_STREAM, 0);
    >
    > memset(&serverAddress, 0, sizeof(serverAddress));
    > serverAddress.sin_family        = AF_INET;
    > serverAddress.sin_addr.s_addr    = htonl(INADDR_ANY); //need big-endian
    > byte order
    > serverAddress.sin_port            = htons(8000);
    >
    > fcntl( sockfd, F_SETFD, 1 );
    > setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    > timeToWait.tv_sec    = 30; // Timeout after n seconds...
    > timeToWait.tv_usec    = 0;
    > setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeToWait,
    > sizeof(timeToWait));
    > setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeToWait,
    > sizeof(timeToWait));
    > bind(sockfd, (struct sockaddr *)&serverAddress, namelen);
    > listen(sockfd, 10);
    >
    > receivePort = [[[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    >
    > socketType:SOCK_STREAM
    >
    > protocol:0
    >
    > socket:sockfd] autorelease];
    >
    > theConnection = [[NSConnection alloc]
    > initWithReceivePort:receivePort sendPort:nil];
    >
    > [theConnection setRootObject:self];
    >
    >
    > Client side:
    > ---------------
    >
    > sendPort = [[[NSSocketPort alloc] initRemoteWithTCPPort:8000
    > host:hostName] autorelease];
    > remoteConnection = [[NSConnection alloc] initWithReceivePort:nil
    > sendPort:sendPort];
    > remoteServerMgr = [remoteConnection rootProxy];
    > [remoteServerMgr doSomething];
  • Aurélien,

    Thanks! Changing the protocol to IPPROTO_TCP worked.

    I appreciate the help,

    Allan

    On Nov 27, 2007, at 4:16 AM, Aurélien Hugelé wrote:

    >> receivePort = [[[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    >>
    >> socketType:SOCK_STREAM
    >>
    >> protocol:0
    >>
    >> socket:sockfd] autorelease];
    >
    > Is incorrect
    >
    > use
    >
    > receivePort = [[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    > socketType:SOCK_STREAM protocol:IPPROTO_TCP socket:sockfd];
    >
    > instead. Note that protocol is not the same :)
    >
    > This fixed my problems on Leopard... Tiger was much more tolerant
    > to this...
    >
    >
    > Aurélien,
    > Objective Decision Team
    >
    >
    >
    >
    > On 27 nov. 07, at 00:26, Allan Dushan wrote:
    >
    >> Does anyone have a workaround for the code below? This code worked
    >> great pre-Leopard.
    >>
    >> In order to get the server/client to work I had to switch the
    >> server code below to the single call:
    >>
    >> receivePort = [[NSSocketPort alloc] initWithTCPPort:8000];
    >>
    >> This allows the client to connect, but no longer allows me to
    >> modify the socket. The important modification is SO_REUSEADDR.
    >> Since I cannot do this anymore, if the user quits/force quits the
    >> applications, they have to wait 2+ minutes before restarting the
    >> application in order for the port to be available again.
    >>
    >> Using the current code below, the client can connect, and get the
    >> root proxy, but when you try to make a call to the root proxy an
    >> exception is thrown.
    >>
    >> Is this a bug in Leopard, or do I need to set things up another
    >> way with leopard?
    >>
    >> One last note, if the client is running on an OS that is pre-
    >> Leopard and the server is on Leopard, the connection works. The
    >> problem occurs when both are running on Leopard.
    >>
    >> Allan
    >>
    >>
    >>
    >> Server side:
    >> ----------------
    >>
    >> sockfd = socket(AF_INET, SOCK_STREAM, 0);
    >>
    >> memset(&serverAddress, 0, sizeof(serverAddress));
    >> serverAddress.sin_family        = AF_INET;
    >> serverAddress.sin_addr.s_addr    = htonl(INADDR_ANY); //need big-
    >> endian byte order
    >> serverAddress.sin_port            = htons(8000);
    >>
    >> fcntl( sockfd, F_SETFD, 1 );
    >> setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    >> timeToWait.tv_sec    = 30; // Timeout after n seconds...
    >> timeToWait.tv_usec    = 0;
    >> setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeToWait, sizeof
    >> (timeToWait));
    >> setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeToWait, sizeof
    >> (timeToWait));
    >> bind(sockfd, (struct sockaddr *)&serverAddress, namelen);
    >> listen(sockfd, 10);
    >>
    >> receivePort = [[[NSSocketPort alloc] initWithProtocolFamily:PF_INET
    >>
    >> socketType:SOCK_STREAM
    >>
    >> protocol:0
    >>
    >> socket:sockfd] autorelease];
    >>
    >> theConnection = [[NSConnection alloc]
    >> initWithReceivePort:receivePort sendPort:nil];
    >>
    >> [theConnection setRootObject:self];
    >>
    >>
    >> Client side:
    >> ---------------
    >>
    >> sendPort = [[[NSSocketPort alloc] initRemoteWithTCPPort:8000
    >> host:hostName] autorelease];
    >> remoteConnection = [[NSConnection alloc] initWithReceivePort:nil
    >> sendPort:sendPort];
    >> remoteServerMgr = [remoteConnection rootProxy];
    >> [remoteServerMgr doSomething];
    >
previous month november 2007 next month
MTWTFSS
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
Go to today