68user's page 掲示板

Prev< No. 3925〜3926> Next  [最新発言に戻る] [過去ログ一覧]
No. 3925 # hex 2004/08/17 (火) 02:33:40
どうも初めまして。ネットワークプログラミング始めたばかりの者です。
ちょっと前までは決まりきったものだと特に気に止めずに流していたのですが、
connect()関数の第2引数が
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))
というふうに普通していますが、どういう意味なんでしょうか?
servaddrのアドレスさえ渡してやればいいように思うのですが。(ん?その前にC言語の
文法がまだ完全に理解できていなのかも?)servaddr構造体のアドレスをsockaddr構造体
のポインタでキャストしてる?なんかよく分かりません。
助言をお願いします。

No. 3926 # 68user 2004/08/17 (火) 02:59:57
>>3922 社長の猿
おそらく BASIC 認証と呼ばれるものだと思いますので、
>>2612 68user
を参考にしてください。

>>3923
proxy サーバを経由しないと学校や会社の外に出られない環境とか
(proxy サーバの IP アドレスは 1つ)、一度 IP アドレスが割り当て
られたものの、しばらくアクセスしなかったので他の人に同じ IP
アドレスが割り当てられた、という可能性があります。

>>3924 ネットワーク1年生
わたしはネットワークの仕組みはよく知らないのですが、
> CSMA/CDの他、CSMA/CA、ホットポテトルーティング、近隣探索機能(v6)
CSMA/CD・CSMA/CA は近いという概念とはまったく関係なく、LAN 内での
コリジョンを防止するための仕組みだと思っています。

http://e-words.jp/w/CSMA2FCD.html
http://e-words.jp/w/CSMA2FCA.html

ホットポテトルーティングはわかりません。Anycast もよくわかりませんが、
どこが違いかどうかはルータが判断するものではないかなぁと思っています
(末端のアプリが判断する必要はない)。で、ルータがどういう基準で近さを
判断しているかはわかりません。

>>3925 hex
> servaddrのアドレスさえ渡してやればいいように思うのですが
根本的にはその通りです。ただ、connect(2) は struct sockaddr_in の
アドレスを受け取ったり (インターネットのアドレスの場合)、struct
sockaddr_un のアドレスを受け取ったりしなければいけません (UNIX
ドメインのアドレスの場合)。

しかし C 言語ではいろいろな型を受け取る関数を作ることはできないため
(Java や C++ のように関数のオーバーロードができないため)、struct sockaddr
という汎用的な構造体を定義し、それにキャストすることで connect(2) に
struct sockaddr_in も struct sockaddr_un も渡せるようにしています。

まぁ C の言語上の制約を回避するための汚い手ですね。コンパイラに警告を
くらってもいいなら、キャストなしでも動くと思います (C++ でなく C を使って
いるならば)。

Prev< No. 3925〜3926> Next  [最新発言に戻る] [過去ログ一覧]