2010-02-18 7 views
0

Pourriez-vous m'aider avec ces codes? J'essaie de faire communiquer le client et le serveur de manière asynchrone. Je veux dire que le client et le serveur n'attendent pas les uns les autres (par exemple lorsqu'un serveur ou un client lit recvfrom() et que les données ne sont pas présentes, il prend le dernier reçu (ce que j'ai nommé est backup). pourquoi? ...Serveur socket asynchrone et client travaillant (écrit en C)

client

... 

    /* Create a datagram/UDP socket */ 
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
     DieWithError("socket() failed"); 

    /* Construct the server address structure */ 
    memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ 
    echoServAddr.sin_family = AF_INET;     /* Internet addr family */ 
    echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ 
    echoServAddr.sin_port = htons(echoServPort);  /* Server port */ 

    /* Set signal handler for SIGIO */ 
    handler.sa_handler = SIGIOHandler; 
    /* Create mask that mask all signals */ 
    if (sigfillset(&handler.sa_mask) < 0) 
     DieWithError("sigfillset() failed"); 
    /* No flags */ 
    handler.sa_flags = 0; 

    if (sigaction(SIGIO, &handler, 0) < 0) 
     DieWithError("sigaction() failed for SIGIO"); 

    /* We must own the socket to receive the SIGIO message */ 
    if (fcntl(sock, F_SETOWN, getpid()) < 0) 
     DieWithError("Unable to set process owner to us"); 

    /* Arrange for nonblocking I/O and SIGIO delivery */ 
    if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0) 
     DieWithError("Unable to put server sock into non-blocking"); 
... 

serveur ...

/* Create socket for sending/receiving datagrams */ 
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
     DieWithError("socket() failed"); 

    /* Set up the server address structure */ 
    memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ 
    echoServAddr.sin_family = AF_INET;    /* Internet family */ 
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interf*/ 
    echoServAddr.sin_port = htons(echoServPort);  /* Port */ 

    /* Bind to the local address */ 
    if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 
     DieWithError("bind() failed"); 

    /* Set signal handler for SIGIO */ 
    handler.sa_handler = SIGIOHandler; 
    /* Create mask that mask all signals */ 
    if (sigfillset(&handler.sa_mask) < 0) 
     DieWithError("sigfillset() failed"); 
    /* No flags */ 
    handler.sa_flags = 0; 

    if (sigaction(SIGIO, &handler, 0) < 0) 
     DieWithError("sigaction() failed for SIGIO"); 

    if (fcntl(sock, F_SETOWN, getpid()) < 0) 
     DieWithError("Unable to set process owner to us"); 

    /* Arrange for nonblocking I/O and SIGIO delivery */ 
    if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0) 
     DieWithError("Unable to put client sock into non-blocking"); 
... 

Les codes sont compilés et liés à un problème, mais ils ne pas échanger des données entre eux, est il y a un problème quelque part?

Merci pour vos réponses,

PS: les codes sont maintenant supprimés ...

Répondre

1

Vérifiez votre port, je pense qu'ils maxed ... devrait être 65535 qui est le maximum pour un numéro de port (16 bits)! Donnez-lui un plus petit nombre et vous devriez être ok!

Édition: Le nombre maximal de ports utilisés est 65536, ce qui correspond à un maximum de 16 bits, car il s'agit d'un court-circuit. Si vous dépassez le maximum, cela échouera. Donnez à la fois client et serveur un numéro de port qui est supérieur arbitraire à 1024 et moins de 65536.

Jetez un oeil à la programmation Beej's Guide à douille ...

Hope this helps, Meilleures salutations, Tom.

+0

merci pour la réponse! Les deux utilisent le même port. Voulez-vous dire que je devrais en donner un de plus? – make

+0

@mk: non! Les deux ports doivent être les mêmes, mais ils ont dépassé le numéro de port maximum qui est au maximum de 16 bits est 65536, donnez-lui un port inférieur dis ... 12345 pour le client et le serveur ... – t0mm13b

+0

@ tommieb75: Merci beaucoup pour votre commenter comme je n'ai pas remarqué que le port était plus élevé que la limite. Comme je travaille sur Solaris, je pense que le port dépend du système d'exploitation, qui est de 32 ou 64bits ... merci gain, c'était un joli commentaire que j'ai reçu aujourd'hui de votre part ... – make

0

Lors de votre recv, vous pouvez utiliser MSG_PEEK | MSG_DONTWAIT en tant qu'options à recv ce qui vous permettra de vérifier simplement s'il y a des données qui doivent être lues.

+0

merci pour la réponse! S'il vous plaît donnez un exemple ... – make

Questions connexes