2016-11-29 85 views
0

1)我正在嘗試使用UDP製作一個簡單的遊戲服務器。我的代碼是否是正確的方法來檢查是否有從單個套接字讀取?udp在C++中輪詢套接字和多播

2)我想從一個用戶的請求(他想要向左移動)接收數據,然後更新服務器認爲他或她所在的位置,然後廣播x,y座標。我將如何使用不同的套接字實現組播應答?

void run() 
{ 
    //logging file 
    ofstream log; 
    log.open("server_log.txt", ios::out | ios::app); 

    struct sockaddr_in myaddr;  // our address 
    struct sockaddr_in remaddr;  // remote address 
    socklen_t addrlen = sizeof(remaddr); 
    int recvlen; 
    int fd;       // server socket that listens 
    int fd_reply;     // this will be used to reply to all users 
    char buf[BUFSIZE];  // receive buffer 


    memset((char *)&myaddr, 0, sizeof(myaddr)); 
    myaddr.sin_family = AF_INET; 
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    myaddr.sin_port = htons(PORT); 

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 
     std::time_t result = std::time(nullptr); 
     log << "Error: cannot create socket! " << "TIMESTAMP: " << std::asctime(std::localtime(&result)) << endl; 
     log.close(); 
     return 0; 
    } 

    if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) { 
     std::time_t result = std::time(nullptr); 
     log << "Error: bind failed " << "TIMESTAMP: " << std::asctime(std::localtime(&result)) << endl; 
     log.close(); 
     return 0; 
    } 

    pollfd fds; 

    memset(fds, 0, sizeof(fds)); 

    fds[0].fd = fd; 
    fds[0].events = POLLIN; 

    while (1) 
    { 
     int rv = poll(ufds, 1, 3500); 
     if (rv == -1) 
     { 
      // error occured 
     } 
     else if (rv == 0) 
     { 
      //time out 
     } 
     else 
     { 
      //check for events on fd 
      if (fds.revents & POLLIN) 
      { 
       recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen); 
      } 
     } 
    } 
} 

回答

0
  1. 是它看起來還好。

  2. 保留所有客戶端的列表,然後在一個循環中發送給所有客戶端。要填充此列表,所有客戶端都需要首先聯繫服務器。

+1

儘管小記 - 你幾乎總是想將套接字設置爲非阻塞模式。在上面的代碼中,recfrom()仍然可以阻塞各種不明確的原因(例如UDP數據包未通過校驗和,所以在輪詢返回後它會被丟棄。) – nos

+0

在我的完整項目中,我製作了一個向量,該向量包含用戶的所有sockaddr_in, 「 遊戲。我將如何將udp套接字設置爲非阻塞? – kubuni

+0

@kubuni搜索它。將軍們在互聯網上有數以千計的示例和教程。他們中的大多數還應該展示如何爲您的平臺創建一個無阻塞的套接字以及如何處理它們。 –