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);
}
}
}
}
ほとんどの場合、ほとんどの場合、ソケットを非ブロッキングモードに設定する必要があります。上記のコードでは、recfrom()は様々な不明な理由でブロックすることができます(例えば、UDPパケットのチェックサムチェックが失敗したため、ポーリングが戻った後に破棄されます)。 – nos
私のフルプロジェクトでは、 "join " ゲーム。 udpソケットをノンブロッキングに設定するには? – kubuni
@kubuniそれを検索してください。一般のソケットには、インターネット上に数千の例とチュートリアルがあります。彼らの大部分は、あなたのプラットフォームにソケットを非ブロッキングにする方法と、それらを処理する方法を示すべきです。 –