私は現在、最大3人のクライアントがサーバーに接続でき、ゲームがすべてのクライアントとサーバーの間で行われるゲームを設計する必要があるネットワークゲームに関するプロジェクトを行っています。私は、サーバー側とクライアント側の両方で "sockaddr_in"構造体を使用しています。gethostbyname()alternatives in c
私のゲームでは誰でもサーバになることができ、クライアントはサーバに接続できるように正しいIPアドレスとポート番号を与える必要があります。 "server_address.sin_addr.s_addr"と "server_address.sin_port"にサーバとポート番号のIPアドレスの値をハードコードすると、ゲームは正常に動作します。しかし、ハードコーディングは、誰かがサーバーであり、クライアントにサーバーのアドレスとポート番号を入力するように依頼するという私の問題を解決するものではありません。だから、私はクライアントの側で "gethostbyname()"関数呼び出しを使用しました。しかし、それは私の問題を解決しませんでした。 。(その理由は、渡されたときに数値文字列が指定されていない(ソース)のgethostbynameの振る舞い(ある可能性があります。link)以下
は、サーバ側で私が使用するコードです:
struct sockaddr_in serv_addr, client_addr;
/* open a socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
err_ret = errno;
return err_ret;
}
/* set initial values */
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr(IP);
memset(&(serv_addr.sin_zero), 0, 8);
/* bind address with socket */
if(bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
err_ret = errno;
return err_ret;
}
とクライアントでサイド
struct sockaddr_in serv_addr;
struct hostent *to;
/* generate address */
if((to = gethostbyname(IP))==NULL)
{
err_ret = h_errno;
fprintf(stderr, "gethostbyname() error...\n");
return err_ret;
}
/* open a socket */
if((newfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
err_ret = errno;
fprintf(stderr, "socket() error...\n");
return err_ret;
}
/* set initial values */
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
memcpy(&serv_addr.sin_addr, to->h_addr_list[0], to->h_length);
memset(&(serv_addr.sin_zero), 0, 8);
は、ここでは誰もが上記のプロセスを実行するための効率的な方法を教えてください。
任意の助けをいただければ幸いです。
gethostbyname(IP)が正しい数値のアドレス文字列で失敗するという問題はありますか?または、1つのホストをサーバーとして動的に構成し、そのIPアドレスを潜在的なクライアントに知らせる方法についての質問はありますか? –
私の問題はあなたが言及した最初のものです。また、2番目の問題の解決策は、ゲームを改善するのに役立ちます。あなたは同じことに関するヒントを教えてもらえますか? – likecs
それで 'IP 'には何が入っていますか? 'gethostbyname(IP)'は何を返しますか?どのようにして "あなたの問題を解決しない"か?エラー状態は 'h_errno'に書き出され、' errno'には書き出されないことに注意してください。 –