1

私はUDPを介してサーバーにさまざまな要求を送信することを含むプロジェクトに取り組んでいます。ただし、サーバーが私の要求に応答しないため、ソケットの設定が完全​​に間違っているようです。テスト用のサーバーバイナリが提供されましたが、以下のコードは応答を示しません。UDPソケットを正しく設定していますか?もしそうなら、私はどういうわけかsendtoを間違って使用していますか?正しいビット数を送信していることを確認しました。

プログラムの入力は次のとおりです。./client [URL] [port] [username]、そして私は常に。でテストし./client localhost 8080 userます。これが私が送信している構造体とコードです。

struct request_login {
    int req_type; /* = REQ_LOGIN */
    char req_username[32];
} packed;

コード:

struct sockaddr_in sa;
int sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd == -1){
   printf("Could not create socket.");
   exit(EXIT_FAILURE);
}

// Prepare the socket address
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(argv[1]);
// Convert to network order
sa.sin_port = htonl(atoi(argv[2]));

// Assemble and send login request
struct request_login * reqlogin = (struct request_login *) malloc(sizeof(struct request_login));
reqlogin->req_type = REQ_LOGIN;
strcpy(reqlogin->req_username, argv[3]);

int res = sendto(sockfd, reqlogin, sizeof (struct request_login), 0, (struct sockaddr*)&sa, sizeof sa);
free(reqlogin)
4

3 に答える 3

3

は?

これ:

sa.sin_addr.s_addr = inet_addr(argv[1]);

argv[1]あなたが言うように、あなたが言うように、通常は正しいことをすることは確かにありません"localhost"。IPアドレスを取得するには、ホスト名を検索する必要があります。inet_addr()入力が点線のIPアドレスであり、ホスト名ではない場合にのみ使用できます。

を見てくださいgetaddrinfo()

于 2012-10-24T07:48:41.977 に答える
2

コードを数回読み直した後、エラーの原因の1つが何であるかがわかったと思います。

sa.sin_port = htonl(atoi(argv[2]));

ポート番号はshortなので、htons代わりに使用する必要があります。とても小さくて見逃しやすいです。

于 2012-10-24T07:49:20.997 に答える
1

代わりにこれを試してください:

struct addrinfo hint;
memset(&chk,0,sizeof(chk));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_protocol = IPPROTO_UDP;

struct addrinfo* servAddr = NULL;
int ret = getaddrinfo(argv[1],atoi(argv[2]),&hint,&servAddr);
if (-1 == ret)
{
  perror("getaddrinfo failed");
  exit(EXIT_FAILURE);
}

int sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd == -1){
   printf("Could not create socket.");
   exit(EXIT_FAILURE);
}

// Assemble and send login request
struct request_login reqlogin;
reqlogin.req_type = REQ_LOGIN;
strcpy(reqlogin.req_username, argv[3]);

int res = sendto(sockfd, &reqlogin, sizeof (struct request_login), 0, servAddr->ai_addr, servAddr->ai_addrlen);
于 2012-10-24T10:03:05.653 に答える