繁体   English   中英

C ++中的udp轮询套接字和多播

[英]udp poll sockets and multicast in C++

1)我正在尝试使用UDP创建一个简单的游戏服务器。 我的代码是检查单个套接字是否有任何读取的正确方法吗?

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);
            }
        }
    }
}
  1. 是的,看起来还不错。

  2. 保留所有客户端的列表,然后循环发送给所有客户端。 要填充此列表,所有客户端都需要首先与服务器联系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM