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);
}
}
}
}
儘管小記 - 你幾乎總是想將套接字設置爲非阻塞模式。在上面的代碼中,recfrom()仍然可以阻塞各種不明確的原因(例如UDP數據包未通過校驗和,所以在輪詢返回後它會被丟棄。) – nos
在我的完整項目中,我製作了一個向量,該向量包含用戶的所有sockaddr_in, 「 遊戲。我將如何將udp套接字設置爲非阻塞? – kubuni
@kubuni搜索它。將軍們在互聯網上有數以千計的示例和教程。他們中的大多數還應該展示如何爲您的平臺創建一個無阻塞的套接字以及如何處理它們。 –