2017-03-02 14 views
2

私はchar *という名前のIPであるメインに引数を渡します。名前はipStrです。このsendto()から「無効な引数」が表示されるのはなぜですか?

それから私はsendto()を呼び出す前に、それの長さを保持する変数を初期化しています:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
char buffer[8]; 
socklen_t ipLen = sizeof(ipStr); 

      res = sendto(sock, buffer, sizeof(buffer), 0, 
        (struct sockaddr*) &ipStr, ipLen); 

しかし、私はまだ返されたエラーとしてInvalid argumentを取得しています。

g ++でコンパイルエラーが発生しないため、どこに問題があるのか​​わかりません。私はipLensizeofを削除していなかった気づい

EDIT

は、上記を変更し、まだInvalid argumentを得ます。

+0

ソケットは正しく返されますか? ipStrとは何ですか? – Joe

+0

はい 'sock'が正しく返ってきますが、ipStrが何に設定されているのかが分かりません。 – xeon48

+1

ipstrがあなたの「無効な引数」かもしれませんが、私はあなたの主張が何のためのコードも見ません。あなたの問題を示す完全なコードを見てみましょう。 – Joe

答えて

3

sockaddrが間違っている可能性があります。structには、アドレスとその他のデータが2進数で表示されています。 sockaddrにキャストされたのはsockaddr_inです。

試してみてください。

struct sockaddr_in ip4addr; 

ip4addr.sin_family = AF_INET; 
ip4addr.sin_port = htons(1234); 
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4"); 
0

socklen_t ipLen = sizeof(ipStr)ipStrデータ型のサイズではなく、それが指す文字列の長さを返します。 ipStrのデータタイプはchar *であり、したがってsizeof(ipStr)8(または32ビットシステムでは4)です。したがって、パラメータが正しく解釈されない可能性があります。

代わりにsocklen_t ipLen = strlen(ipStr)を使用してください。

+0

'sendto'は文字列や文字列の長さを期待しません。 –

+0

@ n.m。 'ipLen = sizeof(ipStr)'は意味がありません(sendtoで使われていない場合)か間違っていますか?そうではありませんか? –

+0

iplenは無意味ですが、ipstrが最初にあってはいけないので問題はありません。 –

関連する問題