2016-11-29 10 views
0

1)私はUDPを使って簡単なゲームサーバーを作ろうとしています。私のコードは、単一のソケットからの読み取りがあるかどうかをチェックする正しい方法でしょうか?udpポーリングソケットとC++でのマルチキャスト

2)リクエストに応じて1人のユーザーからデータを受信したい(彼は左に移動したい)、次にサーバーが自分がいると思う場所を更新してから、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

私のフルプロジェクトでは、 "join " ゲーム。 udpソケットをノンブロッキングに設定するには? – kubuni

+0

@kubuniそれを検索してください。一般のソケットには、インターネット上に数千の例とチュートリアルがあります。彼らの大部分は、あなたのプラットフォームにソケットを非ブロッキングにする方法と、それらを処理する方法を示すべきです。 –

関連する問題