質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

912閲覧

C言語 socket 条件式とconnectの第2引数(struct sockaddr *)&client_addr について

kazuyakazuya

総合スコア193

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/08/25 12:39

C言語を参考記事socket
参考に学んでいるのですがわからないところがあったので教えてください。
イメージ説明

c

1if (connect(sockfd, (struct sockaddr *)&client_addr, 2 3 sizeof(client_addr)) > 0) { 4 5 perror("client: connect"); 6 7 close(sockfd); 8 9 exit(1); 10 11 }

この中の

C

1if (connect(sockfd, (struct sockaddr *)&client_addr, 2 3 sizeof(client_addr)) > 0)

この中で2点わからないところがあるのでお願いします。

#質問1(struct sockaddr *)&client_addr

if文の中の(struct sockaddr *)&client_addrが理解できないです。
そもそもconnectの引数について
イメージ説明

string

1接続の試行先のソケット・アドレスを含む ソケット・アドレス構造体を指すポインター。

一応

c

1(struct sockaddr *)&client_addr 2の中の 3&client_addr

がアドレスを示していることはわかるのですが

c

1(struct sockaddr *)

これの意味が理解できません。
前の質問 ポインタについて・・・
類似していますけど、このコードがどうポインタ(?)したいのかが
わかりません。

#質問2 if文について

c

1if (connect(sockfd, (struct sockaddr *)&client_addr, 2 3 sizeof(client_addr)) > 0)

この文は

c

1(connect(sockfd, (struct sockaddr *)&client_addr, 2 3 sizeof(client_addr)){ 4処理 5}

単純にこれが0より大きければ処理を実行するという
文だと思うのですが

この0より大きければっておかしくないですか?
(構造体が2つ?)
connectで接続ができたらっていうことなのですか?
(それでも0を使い意味が分からない・・・。)

分からないので参考になるリンクまたは説明をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問1:

今はおまじないとして進めたほうがいいと思います。
connect関数の第二引数はstruct sockaddr*なのでそれに型変換しています。
型が合わないとコンパイル時にWarningが出たりErrorになったります。

connect関数は今回のサンプルにあるようなIPv4以外にも様々なプロトコルに対応しています。
そして、プロトコルによって接続先を表現するのに必要なデータ型やバイト数が変わってくるわけです。
IPv6で接続するのであればstruct sockaddr_in6型で定義した変数で接続先を指定します。
その場合でもconnect関数の引数の仕様は変わらないので型変換が必要になります。

質問2:
サンプルが間違っていると思います。
connect関数の関数仕様からエラーを判断するには"!= -1"か"< 0"とするべきです。

投稿2019/08/25 13:15

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/08/25 13:18

ありがとうございます。
guest

0

ベストアンサー

質問1:

これの意味が理解できません。

キャストです。キャストについて全く知らないのであれば、このレベルのプログラムを読み書きするには早すぎます。

質問2:

分からないので参考になるリンクまたは説明をお願いします。

先の質問でアドバイスしたと思いますが、man connectは見て無いのでしょうか?

(connectの)

返り値
接続または対応づけに成功するとゼロを返す。 失敗すると -1 を返し、 errno に適切な値を設定する。

と書いてあるので、絶対に正にはなりません。ゼロなら成功。負なら-1のはずでエラーなので、そのプログラムは不等号の書き間違いでしょう。connectがエラーでも検知できず正常とみなして続行してしまいます。

あと、プログラムを1行おきに書くのはやめましょう。1画面に表示できるコード量が減り、大変見にくくなります。

投稿2019/08/25 12:59

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/08/25 13:14

ありがとうございます。 ポインタじゃないキャストでした・・・。 次からコードの表示のさせ方を変えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問