2017-04-23 13 views
-1

私は現在、最大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); 

は、ここでは誰もが上記のプロセスを実行するための効率的な方法を教えてください。

任意の助けをいただければ幸いです。

+0

gethostbyname(IP)が正しい数値のアドレス文字列で失敗するという問題はありますか?または、1つのホストをサーバーとして動的に構成し、そのIPアドレスを潜在的なクライアントに知らせる方法についての質問はありますか? –

+0

私の問題はあなたが言及した最初のものです。また、2番目の問題の解決策は、ゲームを改善するのに役立ちます。あなたは同じことに関するヒントを教えてもらえますか? – likecs

+0

それで 'IP 'には何が入っていますか? 'gethostbyname(IP)'は何を返しますか?どのようにして "あなたの問題を解決しない"か?エラー状態は 'h_errno'に書き出され、' errno'には書き出されないことに注意してください。 –

答えて

0

getaddrinfoは、gethostbynameに取って代わりました。これにより、IPアドレス文字列からsockaddr_in構造体を簡単に作成できるようになります。

数値形式の文字列またはホスト名をsockaddr_inに変換するサンプルコード。

struct addrinfo hints = {}; 
addrinfo* pResultList = NULL; 
struct sockaddr_in addr = {}; 
char* hostname = "1.2.3.4"; 

hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 
// hints.ai_flags = AI_NUMERICHOST; // if you know hostname is a numeric stirng, you can skip the DNS lookup by setting this flag 

result = getaddrinfo(hostname , NULL, &hints, &pResultList); 

if (result) 
    memcpy(&addr, pResultList->ai_addr, sizeof(addr)); 

if (pResultList != NULL) 
{ 
    ::freeaddrinfo(pResultList); 
} 
+0

誰かがダウンしました。理由は分かりません。おそらく、彼は答えについて好きではなかったことについてコメントしたいと思っていますか? – selbie

+0

おそらく 'inet_ntoa'は非難され、しばらくありました。 'getaddrinfo'は古いものではなく、あなたが使うべきものです。 –

+0

@BoundaryImposition - これは、もともとinet_ptonとinet_atonの両方を引用していたことを考えると、あまりにも淡々とした理由があります。 inet_ptonは、すべてのプラットフォームで使用できるとは限りません。いずれにしても、私はOPを 'getaddrinfo'だけを使って操縦するように答えを更新することに決めました。おそらくあなたはあなたの投票を再考するでしょう。 – selbie