- 1 名前: ◆h6A7qfFFu6 mailto:sage [2008/12/29(月) 11:05:07 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/
- 474 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:31:56 ]
- コピーのコストより、
コピーコンストラクタの実装がマズくて 問題が発生しないかチェックする方が重要だったりするよね。
- 475 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:47:54 ]
- いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、 ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。 自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。 大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて いくらでもある。ただ・・・ while(代入式) は不適切だ。
- 476 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:50:59 ]
- >>475
「いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。 それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、 ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。 自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。 大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて いくらでもある。」 ここまでそっくりそのままお前に返すよwww
- 477 名前:469 mailto:sage [2009/01/03(土) 16:59:01 ]
- >>472,473,474
ありがとうございます。 ポインタを使うのがしっくり来そうです
- 478 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:59:49 ]
- Cの規格に沿った構文解析器でも作ってみたら?
while(代入式)が不適切だろうがなんだろうが正しいんだから。
- 479 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:08:53 ]
- >>478
コンパイルできて規格合致であることは誰も否定していない。
- 480 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:11:38 ]
- >>479
まぁ確かに。 言いたかったのは、そこまで熱くならんでもいいんじゃね?ってこと。
- 481 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:13:34 ]
- >>480
478みたいな書き方だとまた話を蒸し返されそうな雰囲気だから勘弁してくれ。
- 482 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:13:44 ]
- >>479
いや、否定してる奴が約一名いるぞ >>442 とか>>475 とか
- 483 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:15:22 ]
- >>481
失礼した。 書き方に気をつける。
- 484 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:16:04 ]
- while文の条件は条件式にするってのは良い心がけだと思うよ。
linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、 経験積んだらそういうソースにも慣れると良い
- 485 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:33:25 ]
- 条件式ではなく比較式と言ってくれ。
- 486 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:42:19 ]
- >>485
呂布かいでし
- 487 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:44:55 ]
- 比較するとは限らんぜ
- 488 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 19:17:03 ]
- 式・・・それは愛・・・・・・
- 489 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 19:59:08 ]
- >>485
そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。
- 490 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 20:05:45 ]
- お前、リテラルの意味分かってないだろ
- 491 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 20:58:12 ]
- >>489
if(hoge()!=0)... とか? あるいは、if((x<y)!=0)... ということだろうか?
- 492 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:00:05 ]
- (is_hoge() == true) == trueのことだろ。
- 493 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:05:04 ]
- >>492
真理値型の無い言語だぞ? 巣に帰れよ。
- 494 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:16:20 ]
- リテラルってほらあれだ
前屈みになって腕を横に挙げるやつ
- 495 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:18:09 ]
- ボケがわかりにくい上につまんねーよw
- 496 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:19:33 ]
- どどんまい?
- 497 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:32:53 ]
- >>493
処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、 if(hoge()){・・・} if(hoge()==TRUE){・・・} とか。
- 498 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:01:46 ]
- >>493
お前の頭はC89止まりか。
- 499 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:07:12 ]
- 左辺が右辺より大きいとき
と 左辺が右辺以上の時 って何が違うんでしょうか? >これと>=を使い分けたりすることってあるのでしょうか?
- 500 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:09:23 ]
- >>499
ちゅうがっこう から やりなおせば わかると おもいます。
- 501 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:11:25 ]
- >>500
それいぜんに にぽーんごの もんだいかと おもわれまっしゅる
- 502 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:12:31 ]
- ヾヽ\ヾ\ //// //
\丶\\ //// |・\ _____ /・> /// / ̄ ̄ ̄ ̄\,, ミ\.\ヽ|||liiiii||/ /./彡 //// |・\ /_____/・> /\.\|||iii||l//彡 ノ( ミ \.\ヽ|||liiiii||/ /./ノ( / / (,-、 ,:‐、 ) \ ⌒ヽ \.\|||iii||l// | ⌒ .|/ ─////─ ヽ | |(,-、 ,:‐、 ) 6 l |. ////── | .| \\\ . ////Vヽ ,-′ ////'VVVヽ | l ////ェ∧/_ /ヽ . //// γ l / / //// |/\/ l ^ //// i∧ェェェ∧/ / / //// | |//// l━━(t)━━━━┥
- 503 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:28:36 ]
- >>499
左辺==右辺の時に真になるか偽になるかの違い。 必要に応じて>と>=のふさわしい方を使う。
- 504 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:30:48 ]
- xが12より大きいとき
xが12以上の時 より・・以上・・そこにある違い・・それが問題ってことですよね?
- 505 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:30:52 ]
- 面白い釣りだなあ。
- 506 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:32:36 ]
- >>503
x >= 10 == x > 10 は偽になるってことでしょうか?
- 507 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:34:12 ]
- さんすうのきょうかしょをよんでね
- 508 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:42:07 ]
- >>506
x==10のときだけ偽、それ以外は真。
- 509 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:42:37 ]
- 優先順位は大丈夫か?
- 510 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:44:32 ]
- >>509
優先順位知らないんなら口出すなw
- 511 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:47:21 ]
- 申し訳ございません
- 512 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:59:32 ]
- >>508
そ・・そうか!! やっと理解できました!!!! x < 10は10もは含まれないってことですよね!? だから int a; cin>>a; if("x < 10"){ cout<<”真"<<endl; はxが10より小さいってことで つまり10と入力しても偽になるわけだ!!!!!!!!!
- 513 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:16:33 ]
- while ("テュルー")
はどうなりますか?
- 514 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:17:47 ]
- 無限ループ
- 515 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:17:50 ]
- 突っ込みどころ満載w
- 516 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:18:13 ]
- ・・・??
- 517 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:25:24 ]
- while("forever") ってしない?
- 518 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:27:07 ]
- しない
- 519 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:30:13 ]
- >>517
条件式じゃないと暴れだす奴がくるぞw
- 520 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:34:54 ]
- >>517
そのアイデア貰った
- 521 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:43:25 ]
- ちょ、それ古典w
- 522 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:43:49 ]
- 俺も面白いと思った。
while("無限ループ") { /* なんか */ } まあ、しないけど
- 523 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:44:49 ]
- >>519
さすがにお前の粘着ぶりがキモイ
- 524 名前:デフォルトの名無しさん [2009/01/03(土) 23:46:13 ]
- while(j=10-i++) を書いた奴が指摘されて、まだファビョってるのか?
基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。
- 525 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:49:41 ]
- whileの括弧の中が条件式でなければ駄目とは言っていないし、変数を用いて
0か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく 代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・
- 526 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:51:04 ]
- プw
- 527 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:53:39 ]
- いやぁがんばってるね
- 528 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:55:30 ]
- while(*dst++=*src++);
- 529 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:00:53 ]
- >>525
>while文の括弧の中は、 >本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、 >それに対して条件式にあう措置をとるべき。
- 530 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:03:01 ]
- >>524
ファビョってるのは「while文の中は、条件式が適切なのに、代入式で…」うんぬん いってる>>442だろ ながれ読めよ >>525 >>456 で結論出てるのにいつまでやってんの?
- 531 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:04:48 ]
- >>530
>>524=>>442で本人だからしょうがないんだよw
- 532 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:15:46 ]
- 最近よく喧嘩するね
- 533 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:29:14 ]
- テュルー
- 534 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:29:51 ]
- 冬休みだからしかたない
- 535 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:30:16 ]
- 出た、「冬休み」
- 536 名前:デフォルトの名無しさん [2009/01/04(日) 00:37:35 ]
- connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr))
この文の * が意味することがまったくわかりません *の後に文字もないのですが、ポインタとしてありえなくないでしょうか?
- 537 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:38:30 ]
- ポインタ型でキャストしてるだけ
- 538 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:51:54 ]
- 人はなぜ>>534のような発言をするのか。
それは「私は子供ではない」と誇示したいからである。 では、「私は大人だ」と主張する人間が「大人」なのだろうか。 答えは否、断じて否である。
- 539 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:56:57 ]
- で?
- 540 名前:536 [2009/01/04(日) 00:57:57 ]
- つまり&echoservaddr構造体のポインタを
sockaddr構造体のポインタとしてあつかうってことでしょうか? まったく何をしているか理解できないのですが
- 541 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:58:58 ]
- >>539
- 542 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:00:57 ]
- >>540
その通りの事をやっている。 sockaddr_in 構造体を sockaddr 構造体であるかのように 無理矢理見なして渡している。 sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、 かつ、こうやってキャストしてもいいと問題ないとされている。
- 543 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:02:07 ]
- connect()の第2引数はstruct sockddr *型(struct sockddr型へのポインタ)を取る。
そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。
- 544 名前:536 [2009/01/04(日) 01:03:51 ]
- >>542
見なす理由がわからないのです。 sockaddr_inのほうが入ってる情報というか入力する情報は多いし その情報はconnectする際に必要だと思います。 なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません
- 545 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:07:27 ]
- www.linux.or.jp/JM/html/LDP_man-pages/man2/connect.2.html
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 2番目の引数の型には、const struct sockaddr *が”必要”
- 546 名前:536 [2009/01/04(日) 01:08:58 ]
- 必要な理由がわからないのです。
ていうか、入れてしまっては前述した疑問がわいてしまって
- 547 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:10:08 ]
- 理由は、connect()がそういう仕様だから。
connect()を作った人間がそういう風に作ったから。
- 548 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:11:16 ]
- >必要な理由がわからないのです。
なんというか……
- 549 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:12:22 ]
- >>544
総称的な型として sockaddr を用意して、 connect は sockaddr* を受け取る汎用的な形にしておいて、 より詳細な構造体として sockaddr_in を用意し、 それをキャストして渡す、という風になってんじゃないのかね。 場合によっては sockaddr_in 以外のものも作るつもりだった、 あるいは将来作れるように、そういう風にしてんじゃない? void* でいいような気もするけど、 それだと何でもキャスト無しに渡せちゃうから、 渡していい構造体なのかどうか注意して指定させるように、 キャスト無しでは渡せないようにしているんだと思う。 まあ、全部推測だけどね。
- 550 名前:536 [2009/01/04(日) 01:13:40 ]
- つまりsockaddr_in 構造体の中にある入力したアドレスに接続するわけですよね。
しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、 アドレスないから接続できなくないのでは?ということです。
- 551 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:14:33 ]
- っていうか、全部が全部
現状が正しい前提で理由を付けなくてもいいと思うけど。 頭いいひとにありがちだよね。
- 552 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:16:41 ]
- 後の改造のために凝った事やって、
結局改造なんてしなかった、 ってこともよくある話で。 互換性のために、とかもよくある話。
- 553 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:18:58 ]
- >>546
int connect(int sockfd, const void *addr, socklen_t addrlen); なら、キャストする必要はないが、connect の第二引数が struct sockaddr である以上、 キャストする必要がある。 ここではキャストする型が重要なのではなく、socket作成時に指定したプロトコルファイミリーが重要。 プロトコルファミリーごとにconnectに必要な情報量は異なり、 kernelでもプロトコルファミリーごとに呼ばれるconnecが異なる。 kernelではaddrlen分ユーザー空間からメモリをコピーし、 所望の処理を行うので、struct sockaddr が重要なのではない。
- 554 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:20:44 ]
- >>550
ああ、そういうことか。 sockaddr_inはsockaddrをIPv4に特化したもの。 sockaddr_inを使うのはIPv4だけだ。 connect()はIPv4以外でも使われる。 www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html AF_INETの他に AF_APPLETALKとかあるだろ。
- 555 名前:536 [2009/01/04(日) 01:26:58 ]
- >>554
socketでAF_INETを指定しているのですが、 この場合だとIPv4でconnectしてるということでは?
- 556 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:34:20 ]
- >>555
そう。 sockaddr_inを使うのはsockaddrを使うより便利だから。 IPv4を使う場合でもsockaddrにアドレスを設定してもいいよ。でも面倒だよ。 ともかく、connect()が必要とするのはsockaddr_inではなくsockaddrなの。 /usr/include/sys/socket.h にstruct sockaddrとstruct sockaddr_inの定義があるから見比べてみてよ。
- 557 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:36:55 ]
- >>550
sockaddrとしてもsa_familyが読み取れる。 そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。 ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。 >>549 そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。
- 558 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:39:57 ]
- どうせサイズ渡してんだし、
sockaddr::sa_family だけでよかった気もする。
- 559 名前:536 [2009/01/04(日) 01:42:07 ]
- struct sockaddr {
u_short sa_family; char sa_data[14]; }; sockaaddr構造体はこのようになっているが、何も入力していない struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; inのほうはこのようになっていて、アドレスはポートやファミリーは入力している。 で、このinの方を struct sockaddr { u_short sa_family; char sa_data[14]; }; これとして扱う。しかし、ここにはアドレスが入っていない。 だとしたら、どうやってサーバーに接続する?という疑問がわきます。 けれど、inに入力したファミリーがsockaaddrに引き継がれて、 sockaddrのファミリがわかって、そこからまた、inの構造体を参照?するのでしょうか どうやって参照するかがまた謎ですが
- 560 名前:536 [2009/01/04(日) 01:44:22 ]
- >sockaddrとしてもsa_familyが読み取れる。
>そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。 これだと、sockaaddrをキャストしてもsockaaddrにはポートやアドレス入力してなければ 読み取れないのでは?
- 561 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:45:14 ]
- 4.2BSDのsockaddrはsa_lenは無くて、sa_familyだけだった。
- 562 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:46:55 ]
- IPv4として使う場合、
アドレスファミリをAF_INETにして sockaddr_inにアドレス詰めて connect()に渡すときはsockaddrにキャストして connect()の内部ではsockaddr_inとしてアドレスを読み出す。
- 563 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:48:29 ]
- >>561
それが合理的だな。 >>560 sockaddr_in を渡すのなら sa_family に AF_INET を入れないといけないし、 sa_family に AF_INET を入れるのなら 渡す物は sockaddr_in でなくてはいけない。 それ以外の使い方して変になっても それはそんな変な使い方をした人が悪い。
- 564 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:48:51 ]
- >>560
入力してなければ読み取れないが、入力するためにsockaddr_inにしてポートやアドレスを入力するんだろ? キャストしてもメモリの内容は変わらない。
- 565 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:50:49 ]
- echoservaddr.sin_family = AF_INET;
echoservaddr.sin_port = xxx; echoservaddr.sin_port = yyy; connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr)) ――connectの中 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { if (addr->sa_family == AF_INET) { const const struct sockaddr *addr_in = (const const struct sockaddr *)addr; だいたいこんな感じのはず。 ここでaddr_in->sin_portを読めばxxxだし、addr_in->sin_addrからはもちろんyyyが読み取れる。
- 566 名前:536 [2009/01/04(日) 01:58:56 ]
- >connect()に渡すときはsockaddrにキャストして
>connect()の内部ではsockaddr_inとしてアドレスを読み出す。 つまり、connectに渡す情報は、空の struct sockaddr { u_short sa_family; char sa_data[14]; }; これであって、特に決まりで中に何も入力されてなくても意味はない。 で、内部でどこのアドレスに接続するか処理するのが、 struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; この入力しておいたinの方。ってことでいいのでしょうか。 inをsockaddrにキャストしても入力しておいた値で共通する変数名とかないですもんね だからキャストしても??
- 567 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:00:32 ]
- 空じゃなくてアドレス等を入力したものをsockaddrとみなして渡してる。
(( struct sockaddr * ) &echoservaddr)->sa_data[2]〜[5]とか見れば納得するのかな?
- 568 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:04:55 ]
- >>566
connectに渡しているのは構造体のアドレス。内容は渡していない。
- 569 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:10:06 ]
- #include <stdio.h>
void print_bytewise(const unsigned char *buf, size_t size) { size_t i; for (i = 0; i < size; i++) { printf("%02X ", buf[i]); } putchar('\n'); } int main(void) { int n = 0x12345678; print_bytewise((const unsigned char*)&n, sizeof n); return 0; } これとやってる事は本質的に同じ。
- 570 名前:536 [2009/01/04(日) 02:13:08 ]
- >>567
struct sockaddr_in { u_short sa_family; char sa_data[14]; [0]short sin_family; [1]unsigned short sin_port [2]struct in_addr sin_addr [3]char sin_zero[8]; }; つまり、イメージ的にはこうなのかな?
- 571 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:17:05 ]
- こう。
sa_family ⇔ sin_family (2 バイト) sa_data[0]〜sa_data[1] ⇔ sin_port (2 バイト) sa_data[2]〜sa_data[5] ⇔ sin_addr (4 バイト) sa_data[6]〜sa_data[13] ⇔ sin_zero (8 バイト)
- 572 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:23:51 ]
- connect(2)ってだいたいこんな感じで使うだろ。
struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(80), .sin_addr = { .s_addr = inet_aton("192.168.1.1") } }; connect(skfd, (struct sockaddr *)&addr, sizeof(addr); >>536はなにか勘違いしてる気がしてならない。
- 573 名前:536 [2009/01/04(日) 02:34:31 ]
- >>571
お! もしかして sockaddr_inは、計16バイトでその情報はsockaddrに全て対応する sa_family はsinfamilyに sa_data[14]には残りの14バイトのアドレスが格納されるということになってるのかな だとすると、どちらかの構造体だけ入力しとけばいいってのも納得できるのですが これでいいのでしょうか?
- 574 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:46:42 ]
- >>573
いままでの回答全て無駄っぽい。 sockaddrはアドレスファミリーから見れば関係ないんだって。 例えばUNIX ドメインソケットなら sockaddr_un だし、 IPv4なら sockaddr_in がconnectには必要。 ただ、歴史的背景かなにかはしらないが、connect(2)のインターフェースが 「void *」ではなく、「sockaddr *」になってるってだけ。
|

|