【问题标题】:Infinite waiting during recvfrom() UDP server and clientrecvfrom() UDP 服务器和客户端期间的无限等待
【发布时间】:2022-01-08 23:54:10
【问题描述】:

我正在尝试在 C 上学习 UDP。

我的目标是在控制台、客户端 consol 中向服务器发送一条消息,并从服务器向客户端发送完全相同的消息。

当我从客户端向服务器发送消息时,我确实收到了,但对方不工作,等待是无限的。

我在控制台没有任何问题。 奇怪的是,我使用完全相同的方法来发送两条消息。

这是我的客户,谢谢大家帮助我:)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
   
#define PORT     8080
#define BUFSIZE 4096

// Driver code
int main(int argc, char *argv[]) {

    char buffer[BUFSIZE];
    struct sockaddr_in servaddr, cliaddr;
    int len, n;
    char *adresse= argv[1];

    
    if (argc<1){
        perror("nb args not enough");
        exit(EXIT_FAILURE);
    } 

    servaddr.sin_family    = AF_INET; 
    servaddr.sin_addr.s_addr =  inet_addr(adresse);
    servaddr.sin_port = htons(PORT);


    // Socket()
     int udp_server = socket(AF_INET, SOCK_DGRAM, 0) ;
     if(udp_server<0){ 
        perror("socket creation failed \n");
        exit(EXIT_FAILURE);
     } 
       

    // Bind())
    int errBind =  bind(udp_server, (const struct sockaddr *)&servaddr, sizeof(servaddr));
    if(errBind<0){
        perror("errBind \n" );
        exit(EXIT_FAILURE);
    }


    // recvfrom()   
 
    n = recvfrom(udp_server, (char *)buffer, BUFSIZE,0, ( struct sockaddr *) &cliaddr,&len);
    if (n<0){
        perror("recvfrom  error\n" );
        exit(EXIT_FAILURE);
    }

    buffer[n] = '\0';
    printf("CLIENT: %s\n", buffer);

    char *message ="caca";

    sendto(udp_server, (const char *)message, strlen(message), 
        0, (const struct sockaddr *) &cliaddr,
            len);
    close(udp_server);
    //////////////////////////This part below is never reached 
    printf("end");
    return 0;

}

这也是我的服务器:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
   
#define PORT     8080
#define BUFSIZE 4096

// Driver code
int main(int argc, char *argv[]) {

    char buffer[BUFSIZE];
    // char *message = "AAAAAAAAAAAAAAAAAA";
    struct sockaddr_in servaddr, cliaddr;
    int len, n;
    char *adresse= argv[1];

    if (argc<1){
        perror("nombre d'arguments insuffisents, veuillez entrer :\n   ./serveur port_serveur \n");
        exit(EXIT_FAILURE);
    } 


        memset(&servaddr, 0, sizeof(servaddr));



    servaddr.sin_family    = AF_INET; 
    servaddr.sin_addr.s_addr =  inet_addr(adresse);
    // servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port = htons(PORT);


    // Socket()
     int udp_server = socket(AF_INET, SOCK_DGRAM, 0) ;
     if(udp_server<0){ 
        perror("socket creation failed \n");
        exit(EXIT_FAILURE);
     } 
       

    // Bind())
    int errBind =  bind(udp_server, (const struct sockaddr *)&servaddr, sizeof(servaddr));
    if(errBind<0){
        perror("errBind \n" );
        exit(EXIT_FAILURE);
    }


   // recvfrom()   

 
    n = recvfrom(udp_server, (char *)buffer, BUFSIZE,0, ( struct sockaddr *) &cliaddr,&len);
    if (n<0){
        perror("recvfrom  error\n" );
        exit(EXIT_FAILURE);
    }

    buffer[n] = '\0';
    printf("CLIENT: %s\n", buffer);

    
    int l = sendto(udp_server, (const char *)buffer, strlen(buffer),
        0, (const struct sockaddr *) &servaddr, 
            sizeof(servaddr));
    
    close(udp_server);

    printf("end");
    //////////////// This is reached
    return 0;

}

【问题讨论】:

    标签: c networking udp


    【解决方案1】:

    有几个问题。主要问题是客户端和服务器都首先尝试接收,然后发送。因此他们不能同时接收到来自另一方的消息。此外,客户端不需要显式绑定套接字。

    原则上客户端必须知道服务器地址,但服务器不知道客户端地址。因此,通信流程必须是客户端首先向服务器发送消息,这将使客户端知道服务器。然后服务器可以向客户端的地址发送消息。

    总之,服务器应该:

    1. 创建套接字
    2. 绑定套接字
    3. 等待消息 (recvfrom())
    4. 将消息发送给收到消息的发件人 (sendto())
    5. 关闭套接字

    客户应该:

    1. 创建套接字
    2. 向服务器发送消息 (sendto())
    3. 等待消息 (recvfrom())
    4. 关闭套接字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多