私は自分のTFTPクライアントを書いています。クライアントはc++(part wise c)で書かれており、UNIXシステム(Linux Debian安定版)で実行されます。
これが私の問題です:
読み取り要求(RRQ)をTFTPサーバー(Windows XPではTFTPサーバーを開く)に送信できます。TFTPサーバーはRRQを受信しますが、応答を送信できません。
サーバー側で次のメッセージが表示されます:クライアント192.168.1.110:55239 C:\ OpenTFTPServer \ test.txt、通信エラー
ただし、ポート55239は、TFTPクライアントで定義したポートではありません。
これが私のコード部分です:
クライアントとサーバーのアドレスを設定します。
memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servport); // servport=69 servaddr.sin_addr.s_addr = inet_addr("192.168.1.152"); memset(&cliaddr,0,sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(cliport); // cliport=13337 cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
接続してバインド:
if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0) { bail("Unable to connect with the server!"); } if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0) { bail("Unable to bind to adr & port!"); }
TFTP要求を作成します。
memset( &cBuf1, 0, sizeof cBuf1); rdwrFrame = (struct tftp_wr_rq *)&cBuf1; rdwrFrame->opcode=htons(1); rdwrFrame->data={'t','e','s','t','.','t','x','t','\0','o','c','t','e','t','\0'};
TFTP要求を送信します。
if (sendto (serv,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0) { bail ("Send the first requirment Frame error -- UDP"); }
これが私の質問です:
TFTPサーバーが間違ったポートを受信するというのは何が間違っているのでしょうか。cliaddr.sin_port = htons(cliport);で設定する必要があると思いました。
あなたの助けをありがとう&リコよろしく
答え:
私の問題は、間違ったソケットと間違ったアドレス構造体を組み合わせたことでした
これが私の動作するコード部分です:
ソケットを作成します。
serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (serv < 0) { bail("Unable to create socket tx!"); } cli = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (cli < 0) { bail("Unable to create socket rx!"); }
クライアントとサーバーのアドレスを設定します。
memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servport); servaddr.sin_addr.s_addr = inet_addr("192.168.1.152"); memset(&cliaddr,0,sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(cliport); cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
接続してバインド:
if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0) { bail("Unable to bind to adr & port!"); } if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0) { bail("Unable to connect with the server!"); }
TFTP要求を作成します。
memset( &cBuf1, 0, sizeof cBuf1); rdwrFrame = (struct tftp_wr_rq *)&cBuf1; rdwrFrame->opcode=htons(1); rdwrFrame->data={'t','e','s','t','.','t','x','t',(char)0,'o','c','t','e','t',(char)0};
TFTP要求を送信します。
if (sendto (cli,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0) { bail ("Send the first requirment Frame error -- UDP"); }
データの受信:
recvfrom(cli,cBuf2,19,0,(struct sockaddr *)&cliaddr,(socklen_t*)&cli_length);