Linuxとgccでプログラムしているのですが、
UDPによるデータ送受信で悩んでいます。
(すいません、前回も同じようなこと言いましたね(^^;)

TCPであれば、サーバ側は 1.ソケット生成 2.バインド
クライアント側は 1.ソケット生成 2.コネクト
で通信路が確立されますよね。

UDPはどうなるんでしょうか。コネクションを張らないということは、サーバとクライアントは区別しないんですか?

今現在、TCPのプログラムのSOCK_STREAMとIPROTO_TCPの部分だけをUDPにして実行しているのですが、UDPのくせに
Connectとかやってて気分が良くないのです・・・。(笑)

現在は、SetupForClient(サーバ側)とConnectToServer(クライアント側)というTCPの接続関数をそのまま使っています。前者はいいのですが、後者は明らかにUDP向けではないですよね。

もし、クライアント側の例があったら、教えていただければ嬉しく思います。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

linux での経験はないので、SetupForClient() とかは知らないのですが、socket() は


何でやっても一緒のはずですね。

UDP で接続する場合には、connect() が必要無いのはおっしゃるとおり。だって、
コネクションレスの通信ですもんね。

送信する側は socket() → sendto() です。
受信する側は socket() → bind() → recvfrom() です。

ちょろっと探してみたらサンプルがありましたので参考URLに示します。このページの
下にサンプルのソースへのリンクがありますので、それを見れば、あなたなら分かるでしょう。

参考URL:http://www.fc-lab.com/network/program/berkley/da …
    • good
    • 0
この回答へのお礼

ありがとうございました。大変よくわかりました。

お礼日時:2001/07/06 00:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUDPの転送レートupについての手法について

H261のファイル転送で、TCPとUDPの速度比較を行っていますが、UDPの転送レートがTCPの半分(10BASE-Tの環境でTCPはほぼ10Mbps、UDPは5Mbps)しかでません。
この原因について心当りのある方があれば教えて下さい。

Aベストアンサー

元々TCPとUDPではプロトコルの性質が違いますから、
当然の結果なのではないでしょうか?
TCPはコネクション型、ストリーム型と呼ばれ、
フロー制御や再送信の管理を行い、
信頼性のある高速データ通信を行うことができます。
これに対してUDPはコネクションレス型で、
信頼性の確保は上位アプリケーションで行う必要があります。
UDPの時の上位がどのような処理を行っているかによるかもしれませんが、
UDPは通常高速通信には向きません。

Qクライアント サーバ(Win2000)間ソケット通信について

クライアントの通信APLをDebugするのに、仮のサーバ(Win2000)に接続するのですが、サーバ側の通信APを
どう開発していいのか?本等にはUNIXのAPのサンプルは
あるのですが、WINサーバのサンプルがありません。
教えてください。

Aベストアンサー

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。

「コマンドプロンプトからコマンドを発行」が何を指しているかが分かりませんが、
acceptが即時リターンされ、EWOULDBLOCKなどが返ってきているのであれば
非同期ソケットとして動いているのでしょう。

> サーバ側のAPなのですが、VisualStadioVer6.0にてWin32Applicationにて作成したのですが、
> WinMain()で書きださないとリンク時にエラーになります。

WinMain関数は、いわゆるWin32アプリケーションにおける
main関数だと思ってください。

printf等の標準入出力を使いたいのであれば、
プロジェクトの新規作成→Win32 Console Application で、
HelloWorldアプリケーションをスケルトンに選択すれば分かりやすいと思います。

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。
...続きを読む

QIPsec over TCP/UDPについて

お世話になります。

IPsec over TCP/UDPというのがありますが、
どういう時にTCP、あるいはUDPになるのか
理解ができません。

どなたかご存知の方、ご教授頂けますでしょうか。

Aベストアンサー

> しかし、なぜNAT環境だとUDPなのか理解が難しいですね。

正確を期すと、厳密な意味での"NAT (Network Address Translation)" であれば、ESP over IPでも ESP over UDP でも問題なく通信できますが、最近よく使われる"NAPT (Network Address and Port Translation)" では、ESP over UDP (または ESP over TCP)である必要があります。

なぜか。
NAPTの動作原理を理解されていればわかると思いますが、NAPTは通信プロトコルとしてTCP/IPまたはUDP/IPを使うことが前提になっている技術です。
ESP over IPは、NAPTではまともに扱えないので何らかの例外処置を執る必要が出てくるのです。

なぜESP over TCPではなくてESP over UDPか、という話だと、この短いスペースで説明できるほど理解が深くないので説明はパスさせてください。
(一応ヒント:TCP over TCP はよくない、という話があります。これを調べてみてください。根っこは同じはずです)

> しかし、なぜNAT環境だとUDPなのか理解が難しいですね。

正確を期すと、厳密な意味での"NAT (Network Address Translation)" であれば、ESP over IPでも ESP over UDP でも問題なく通信できますが、最近よく使われる"NAPT (Network Address and Port Translation)" では、ESP over UDP (または ESP over TCP)である必要があります。

なぜか。
NAPTの動作原理を理解されていればわかると思いますが、NAPTは通信プロトコルとしてTCP/IPまたはUDP/IPを使うことが前提になっている技術です。
ESP over IP...続きを読む

QTCP/IP: 非ソケットに対するソケット操作です?

UNIX/gcc。
TCP/IPでチャットプログラムを作っているんですが
ログアウトメッセージなるものを送る前に
sendto() sent a different number of bytes than expected: Socket operation on non-socketというエラーが出ます。
起こる箇所:クライアント
msgStruct.option = htonl(option);
msgStruct.seatLog = htonl(loggedIn);
if (sendto(sock, &msgStruct, sizeof(msgStruct), 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != sizeof(msgStruct)) {
printf("sizeof(msgStruct): %d\n", sizeof(msgStruct));
DieWithError("sendto() sent a different number of bytes than expected");

これはどういうときに起こるのでしょうか?
このエラーが起こり始めたのはファイルの中のポート番号の値を変えてからです。
元通りにポート番号をコマンドの引数から得た値に直せば
このエラーは消えますが、そうするとチャットプログラムとして動作しなくなってしまいます。

//これで各自のクライアントが独自のポート番号を持てます
echoDummyAddr.sin_port = 29990 + (unsigned short)recordNumber;
//元々はechoServPort = atoi(argv[1]);で得た値を送ってました

loggedIn = logIn(option, msgString, seatLog, inet_ntoa(echoClntAddr.sin_addr), echoDummyAddr.sin_port);

関数側(端折ってます):
int logIn(int option, char *id, int loggedIn, char *ip, unsigned short portNum)
{
FILE *file_ptr;
user record_file;
record_file.portNum = portNum;

fwrite(&record_file, sizeof(record_file), 1, file_ptr);
fclose(file_ptr);
}
return loggedIn;
}
小さなヒントでもいいですから、どうか宜しくお願いします。

UNIX/gcc。
TCP/IPでチャットプログラムを作っているんですが
ログアウトメッセージなるものを送る前に
sendto() sent a different number of bytes than expected: Socket operation on non-socketというエラーが出ます。
起こる箇所:クライアント
msgStruct.option = htonl(option);
msgStruct.seatLog = htonl(loggedIn);
if (sendto(sock, &msgStruct, sizeof(msgStruct), 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != sizeof(msgStruct)) {
printf("sizeof(msgStruct): %d\n", ...続きを読む

Aベストアンサー

このエラー(Socket operation on non-socket)
がでるのは、sockの値が破壊され、0になっていると考えられます。
sockはint型で確保されているはずので、printf文で、
sentoを呼び出す前に、sockの内容を表示してみては如何でしょうか。(エラーが発生したときに表示でもかまいませんが)
また、力づくになりますが、いたるところにprintf文をいれる方法もあります。
printf("sock=%d\n",sock);
又は、
sock = socket()のあとで
sock_save = sockとして(sock_saveはint型)
if (sock != sock_save) printf("sock=%d\n",sock);
とする手もあります。(sockが破壊された時に印字される)
そのとき
printf("src=%s line=%d sock=%d\n",__FILE__,__LINE__,sock);とすると、このprintfを実行した、ソース名と行番号も表示されますので、この方がよいかもしれません。

このエラー(Socket operation on non-socket)
がでるのは、sockの値が破壊され、0になっていると考えられます。
sockはint型で確保されているはずので、printf文で、
sentoを呼び出す前に、sockの内容を表示してみては如何でしょうか。(エラーが発生したときに表示でもかまいませんが)
また、力づくになりますが、いたるところにprintf文をいれる方法もあります。
printf("sock=%d\n",sock);
又は、
sock = socket()のあとで
sock_save = sockとして(sock_saveはint型)
if (sock != sock_save) pr...続きを読む

QsystemのUDP192.168.0.255とは?

ファイヤーウォールの遮断(ブロック)ログに
system UDP 192.168.0.3(自分) 138(ポート)/UDP 192.168.0.255(相手) 138(ポート)

と頻繁に出るのですがこれはいったいなんなのでしょうか?

ネットワークでファイルを共有しているため
TCP 192.168.0.3(自分)/192.168.0.4(相手)
以外のsystemの通信は遮断にしています

検索をしてみると UDP 192.168.0.255はファイル共有用だとあるのですがこれを遮断してもファイル共有はできています

不思議なのが
system TCP 192.168.0.3(自分)/192.168.0.4(相手)
system UDP 192.168.0.3(自分)/192.168.0.4(相手)
と両方解放してみると、頼みもしないのに
system UDP 192.168.0.3(自分)/192.168.0.255(?)
と勝手に通信してしまいます

192.168.0.255とは=ネットワーク内の相手のPCということなのでしょうか?

ファイヤーウォールはCOMODOのCIS3を使用しています

よろしくお願いします

ファイヤーウォールの遮断(ブロック)ログに
system UDP 192.168.0.3(自分) 138(ポート)/UDP 192.168.0.255(相手) 138(ポート)

と頻繁に出るのですがこれはいったいなんなのでしょうか?

ネットワークでファイルを共有しているため
TCP 192.168.0.3(自分)/192.168.0.4(相手)
以外のsystemの通信は遮断にしています

検索をしてみると UDP 192.168.0.255はファイル共有用だとあるのですがこれを遮断してもファイル共有はできています

不思議なのが
system TCP 192.168.0.3(自分)/192.168.0.4...続きを読む

Aベストアンサー

ネットマスクが255.255.255.0ならそのアドレスはブロードキャストです
138/udpはWindowsでは「コンピュータ一覧」を作るためのブラウジングサービスを提供しています
マイネットワークから辿らなければこれを遮断していてもファイル共有は可能です

QTCP/IP通信型プログラムです。 サーバのポート番号をクライアントが

TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが取得するプログラムで、
while(1) {
saddr.sin_port=htons(port);
port++;
fprintf(stdout, "%d\n", port);
} のようなのをプログラムのどこに入れれば

よいのでしょうか?

Aベストアンサー

while((ntohs(saddr.sin_port) <= 0xffff) && (connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) == SOCKET_ERROR)) {
 saddr.sin_port = htons((ntohs(saddr.sin_port) + 1));
}

こんなところでしょうか。
whileループに入る前に、スキャンするポートの開始値をsaddr.sin_portに設定しておく必要があります。
# 勿論、それ以外のメンバ変数も適切に設定してある必要があります。
65535番ポートまで接続を試行し、『最初に接続できた』ところでループから抜けるでしょう。

が……
>サーバ自身がポート番号をランダムに変更する設定となっているからです。
というのは設計ミスとしか思えませんが。
上記の方法では接続できるまでポート番号を変えながら試行しますけど、connect()がエラー返却するのに時間が掛かる場合、全ポートの試行が終わるまでにどれだけ掛かるやら…。
接続できたとしても、#2さんが指摘しているとおりソレが目的のサーバプログラムが待ち受けしているポートかは不明です。
例えば同じマシンでWebサーバが動作していて80番で待ち受け中に、目的のサーバが7000番とかで待っていた場合、先に接続するのはWebサーバの方です。

while((ntohs(saddr.sin_port) <= 0xffff) && (connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) == SOCKET_ERROR)) {
 saddr.sin_port = htons((ntohs(saddr.sin_port) + 1));
}

こんなところでしょうか。
whileループに入る前に、スキャンするポートの開始値をsaddr.sin_portに設定しておく必要があります。
# 勿論、それ以外のメンバ変数も適切に設定してある必要があります。
65535番ポートまで接続を試行し、『最初に接続できた』ところでループから抜けるでしょう。

が……
>サーバ自身がポート番...続きを読む

QIP経路とUDP到達性

ルータ群で構成されたL3ネットワークのルーティング設定をしていました。
その際、ある末端に接続したPC-Aにデフォルトゲートウェイ設定がない状態にしていました。

PC-Aから一番遠い側のルータからPC-Aの属するネットワークの経路は確認できるのですが、
PC-Aはゲートウェイ設定が無いため ICMP 応答はできず ping は通りません。

ここで質問です。

「UDPなら片方向の通信到達性は確認できるのでは?」
とう質問をされたのですが、
「UDPはICMP(または他の同レイヤのプロトコル)上の上に位置するレイヤのプロトコルなのでICMP到達性がない時点でUDPの到達もできない」
と考えています。(UDPの到達自体確認できないかもしれないですが。)

この考えは正しいでしょうか?

(言い方を換えるなら、ICMPがNGかつ、UDPがOKということはありえないという認識でよいでしょうか?)

質問自体、間違っている、などありましたらご指摘お願いいたします。

Aベストアンサー

> 「UDPはICMP(または他の同レイヤのプロトコル)上の上に位置するレイヤのプロトコルなので
> ICMP到達性がない時点でUDPの到達もできない」

そもそも、この認識が間違っています。

UDPはICMPの上に位置するレイヤのプロトコルではありません。

UDPはIPプロトコルの上に位置するプロトコルです。
ICMPもIPプロトコルの上に位置するプロトコルです。
つまり、両者は並列でIPプロトコルの上に位置しています。

通信が到達するか否かは、IPプロトコルのルーティングだけで決まります。
その通信の到達性を確認するための要求パケット/応答パケットの
標準フォーマットを決めたのがICMP echoです。
ICMPが通信の到達性を制御しているわけではありません。
同様にUDPも通信の到達性を制御しているわけではありません。

ICMP echoがNGでも、UDPがOKのケースは普通によくあります。
例えば、Windowsファイアーウォールは、デフォルトではICMP echoパケットを
通さないように設定されています。この場合、pingで疎通確認をしてもエラーになりますが、
そのPCにTCP/IPコネクションを生成したり、UDPパケットを届けたりすることは可能です。
普通によくある話です。

> 「UDPはICMP(または他の同レイヤのプロトコル)上の上に位置するレイヤのプロトコルなので
> ICMP到達性がない時点でUDPの到達もできない」

そもそも、この認識が間違っています。

UDPはICMPの上に位置するレイヤのプロトコルではありません。

UDPはIPプロトコルの上に位置するプロトコルです。
ICMPもIPプロトコルの上に位置するプロトコルです。
つまり、両者は並列でIPプロトコルの上に位置しています。

通信が到達するか否かは、IPプロトコルのルーティングだけで決まります。
その通信の到達性を確認す...続きを読む

Qソケット通信(サーバ側)について

環境:Windows2000とWindows2000(サーバに見立てて)

WinScok2にてサーバソケットAPを作ったのですが、
クライアントからの接続でタイムアウトエラーになります。
以前にPC側APとサーバAPでポートが同じでなければいけないと言われ修正したのですが、まだ接続できません。
以前の方にも言われたのですが、サーバAPを起動後にプロンプトからtelnet (リスンされたIP) (ポート番号)で起動すると、接続に失敗しました。とメッセージが表示されます。

サーバAPはaccept()で待っている状態です。

何か洩れている箇所があるのでしょか?

Aベストアンサー

>PC側APとサーバAPでポートが同じでなければいけないと言われ
そんなことはないですよ。
Listenポートは指定しますが、クライアント側は、OSから割り当てられたものを
使うのが普通のやり方です。そうしないと困ることがあるはずです。
(Webサーバを稼動させていると、Webクライアントになれないとか...)

>telnet (リスンされたIP) (ポート番号)で起動すると、接続に失敗しました
accept以前に問題がありそうですね。
ソケットの生成(socket)、バインド(bind)、listen でエラーは出ていませんか?
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

QTCPとUDP

この度、友達よりインターネットの通信方法は
TCPとUDPがありプログラマによって選択ができる
と聞きました。

そこで、TCP通信が体験できたりUDP通信が体験
できるソフトウエアとかwebサイトはありますか?

あったら教えてください。

Aベストアンサー

No.1です。補足します。

もし興味があるようでしたら、Etherealのようなパケットキャプチャソフト(ネットワークを流れる信号を拾って、人が見易いように解析して表示するソフトウェア)を使ってみてはいかがでしょう。

どのアプリケーションが、どのプロトコル(TCP/UDP等)を使って通信しているかが表示されますので、疑似的に"体験"できます。

↓に参考のURLを貼っておきます。

参考URL:http://www.space-peace.com/ethereal/

Qsshクライアントで接続先で開いたウィンドウもクライアント側で表示できるもの

sshクライアントで接続先で開いたウィンドウもクライアント側で表示できるものを探しています。(説明ヘタクソですみません)

普段はTera Termを使っているのですが、OpenGLのプログラムを動かしたいので上記のようなソフトがほしいのです。

よろしくお願いします。

Aベストアンサー

クライアント側で、Xサーバーを動かします。サーバー側でプログラム起動時にDISPLAY環境変数で、192.168.0.1:0.0 のようにディスプレイ名を指定します。
「Windows Xサーバー」で検索してみてください。フリーの物、有償の物があります。


人気Q&Aランキング

おすすめ情報