研究でソケット通信をしなさいといわれましたが、まだまだ、なんとなくしか
わかりません。
できれば、やり方や、ソフトなどほしいですが、
すみませんが、わかりやすく教えてくれませんか?
おねがいします。

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

A 回答 (4件)

わたしも最近ソケット通信のアプリを作成しました。


そのときに使った参考書がとても役に立ったのでお知らせします。

「TCP/IP解析とソケットプログラミング」
澤川渡・綱島明浩 共著  Ohmsha 発行

です。もしかしたらもうお持ちですか?
VBとCのサンプルプログラムがついていて分かりやすいですよ。
    • good
    • 0

検索エンジンは使えますか?



キーワードは、「ソケット(Socket)」のほかに、「Winsock」「TCP/IP」など・・・

>できれば、やり方や、ソフトなどほしいですが、
>すみませんが、わかりやすく教えてくれませんか?

Webには、どちらも鬼のようにたくさんありますよ。

#検索エンジンがだめなときは、別途質問しよう!!
    • good
    • 0

VBとCでと言う事でしたら、


既に開発環境であるVisualStudio(もしくはVBやC++単体)
というソフトはお持ちな訳ですよね?
⇒学生さんであれば学校が持っているはずです。

やり方はソフトに付属のヘルプにまんまソースが載っています。
そのまま実行して動作しますので参考になさってはいかがでしょうか?
    • good
    • 0

調べるのが研究の第1歩ですよ。

まあそれではあんまりなのでちょっと書きます。
ソケットということが分からないなら、用語辞典で調べよう。

>できれば、やり方や、ソフトなどほしいですが、

あなたが開発するんじゃないの?ソフトって開発ソフトかな。
それならVisual Studio6.0でも使って開発できます。

ソケットの通信方式はWebを調べればあります。
あるいは、
技術評論社「インターネットプログラミング300の技」の第3章でも
見て、自分で開発してみてから、質問しましょう。
    • good
    • 0

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

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

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

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

Qselect(ソケット)

ソケットを用いてプログラミングしていると、よく出てくると思うのですが、次の意味を教えてください。
select(SH); $| = 1; select(STDOUT);
$|(特殊記号)やSTDOUTなど、なるべる細かく教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれます。

また、デフォルトではSTDOUTが選択状態になっていますので
> print "hello.\n";

> print STDOUT "hello.\n";
の省略形というわけです。

余談ですが、Perl使いは面倒くさがりが多いので慣用句みたいに
> select((select(SH),$|=1)[0]);
と、まとめて書く人もいます。
これはselectが返す値が直前まで選択されていたソケットだからできる技です。

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれま...続きを読む

Qソケット通信について

VB.NET2005使用

PCと機器とをソケットクラスを使用してやり取りしています。
ここで、LANケーブルの切断やケーブルがコネクタから抜けたなど通信が途絶えた場合、再度接続する方法はありますか?
もちろんケーブル交換、コネクタ確認を行った後です。

Aベストアンサー

見当違いかも知れませんのでご参考程度に見て下さい。

ソケット通信に関して言えば、LANケーブル切断やコネクタからLANケーブルが抜けてしまった場合、強制切断として0(ゼロ)Byteのソケット通信が発生します。
0(ゼロ)Byteの受信を受けたら、ソケットクローズ後、再接続するまで処理を繰り返せば良いと思います。
※0(ゼロ)Byte受信するまでには少々時間が掛かります。

また、LANが切断等されているかどうかを確認する為に、通信相手の端末と?秒間隔でpingコマンドを実行すると良いと思います。
pingコマンドがエラーであれば、やはりソケットをクローズ後、再接続するまで処理を繰り返せば良いのでは無いでしょうか?

参考になれば幸いです。

QTCP/IPプログラミングでのselectについて

selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。
では、コネクション要求(connect)は、検知するのでしょうか?
どなたか回答よろしくお願いします。

Aベストアンサー

もちろん検知しますよ。
LISTENしているソケットに対しての要求を検知したら
acceptしてやればOKです。

Qソケット通信

http://www.microsoft.com/japan/msdn/vbasic/migration/tips/Socket/

上記サイトのVB.NETのサンプルを動作させてみたところ
2バイト文字を送信すると

閉じ括弧”」”以降の文字が表示されません。
半角文字だとちゃんと表示されます。

プログラムの動作を追ったところ

strReceivedData に入っているデータが
2バイト文字を使用すると

例・・・ああああ を送信したとき

"ああああ

というデータになっているようでその関係で表示が崩れるみたいです。
ためしに表示の直前で strReceivedData のデータを編集し

"ああああ"

とするとちゃんと閉じ括弧以降も表示されました。

どうして2バイト文字が入ると受信データの閉じの " が消えるのでしょうか?

Aベストアンサー

サーバー側の文字列構築部分に問題があるようです

Substringが文字数で引数を管理しているのに、与えられるのがソケットから読み込んだバイト数になっているのでおかしくなるようです

直接構築するのではなく 1クッションおいたほうがいいようです

Dim ss as String = System.Text.Encoding.Default.GetString(bytReceiveBuffer)
if ss.IndexOf( chr(0) ) > -1 then
  ss = ss.Left( 0, ss.IndexOf( chr(0) ) )
end if
strReceivedData &= ss

といった具合でしょう

または Encodingする文字列をByte配列のどの範囲かを指定して文字列化します

strReceivedData &= System.Text.Encoding.Default.GetString(bytReceiveBuffer).Substring(0, intReceiveLength)
のGetStringで範囲を絞ってしまいます
strReceivedData &= System.Text.Encoding.Default.GetString(bytReceiveBuffer, 0, intReceiveLength)

サーバー側の文字列構築部分に問題があるようです

Substringが文字数で引数を管理しているのに、与えられるのがソケットから読み込んだバイト数になっているのでおかしくなるようです

直接構築するのではなく 1クッションおいたほうがいいようです

Dim ss as String = System.Text.Encoding.Default.GetString(bytReceiveBuffer)
if ss.IndexOf( chr(0) ) > -1 then
  ss = ss.Left( 0, ss.IndexOf( chr(0) ) )
end if
strReceivedData &= ss

といった具合でしょう

または Encodingする文字...続きを読む

Qselectの意味

selectの意味

リファレンスマニュアルと本のselectの説明がわかりません。
説明の文はなんとかわかるのですが、引数のとり方が「reads[, writes[, excepts[, timeout]]]」となっていて、これは 3 要素の配列を返しているように見えないので、混乱します。「reads[, writes[], excepts[], timeout[]」という書き方なら3 要素の配列を返していると納得できるのですが、ここで返しているのはreadsの中にwritesがあり、更にその中にtimeoutがある配列を返しているんでしょうか?

手元の本に「selectはリクエストを受信すると、リクエストを検出したソケットだけをリストに返します。」とあるのですが、ここで言うソケットとは入力、出力、例外を指していて、リストというのはつまり配列のことなんでしょうか?

Aベストアンサー

a = hoge.select(ARGS)

の場合に、ARGSの部分が引数です。
ここは、「reads[, writes[, excepts[, timeout]]]」とかかれているので
以下の4種類の書き方ができます。
hoge.select(reads, writes, excepts, timeout)
hoge.select(reads, writes, excepts)
hoge.select(reads, writes)
hoge.select(reads)

また、aに代入される値が戻り値です。
ここには、
「戻り値は、timeout した時には nil を、そうでないときは 3 要素の配列を返し、その各要素が入力/出力/例外待ちのオブジェクトの配列です(指定した配列のサブセット)」
と書かれているので
nil 若しくは [???,???,???]の形で値が代入されます。

これでご理解いただけるのではないでしょうか。

Qソケットを使った「非同期」通信について

はじめまして。VB.NETで質問があります。内容は、(スレッドと)ソケットを使った「非同期」通信についてです。

マイクロソフトのページからサンプルコードをコピーして、二行のプロジェクトを作成し以下の二つのコードを追加したんですけど…(ipの指定は、GetHostNameを使っています。)


プロジェクト1:非同期クライアント ソケットの例
Button1_Click
AsynchronousClient.Main()

プロジェクト2:非同期サーバー ソケットの例
Button1_Click
AsynchronousSocketListener.Main()

マイクロソフトのページ(ソケットのコード例)
→ http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconsocketcodeexamples.asp


プロジェクト2のフォームが固まってしまいます。
(Waiting for a connection...を出力ウィンドウに表示したままになってしまいます。)

暫定策として、Shellを使って、サーバー(プロジェクト2のexe)を起動してみたのでが、それでも固まってしまいました。


3日間ぐらいかけてネットで検索とMSDN見たけど、分かりませんでした。キーワードは、以下の通り…
「マイクロソフト .NET スレッド フリーズ サンプルコード 非同期 マルチ select -sql」

Select フックなどの言葉も関係があるようなのですがよく分かりません。

ただ、フォーム上のボタンが押せるようになれば、解決です。

なにかキーワードだけでも、教えてください。お願いします。

はじめまして。VB.NETで質問があります。内容は、(スレッドと)ソケットを使った「非同期」通信についてです。

マイクロソフトのページからサンプルコードをコピーして、二行のプロジェクトを作成し以下の二つのコードを追加したんですけど…(ipの指定は、GetHostNameを使っています。)


プロジェクト1:非同期クライアント ソケットの例
Button1_Click
AsynchronousClient.Main()

プロジェクト2:非同期サーバー ソケットの例
Button1_Click
AsynchronousSocketListener.Main()

マイ...続きを読む

Aベストアンサー

> ■まず、クラスファイルは追加できたのですがprjServerの起動クラスの項目(clsPrj2)にどうやって追加するのか分かりませんでした。

起動クラスではなく、メインモジュール(Sub Main())でした。誤った情報を教えてしまってすいません。


> ■また、クラスファイルから(またはメインモジュールから)フォームをShowするやり方が分かりませんでした。(frmServer.show()ができませんでした。)

オブジェクト指向の概念を結構無視した作り方ですが、よければ参考にしてください。このやり方で「なんちゃってマルチスレッド」となるはずです。
※ちょいと寝ぼけ眼で書いてますんで、多少の間違いは勘弁してください。方向性は大丈夫だと思いますんで・・・。


(1)非同期サーバ起動フラグ格納クラス(仮にclsBoolとします)を作成し、publicメンバ変数(仮にboolean型のbFlag)を用意します(初期値:false)。
(2)frmServerクラスに、clsBool型のpublicメンバ変数(仮にcFlag)を追加します。
(3)Main()関数およびfrmServer.btnServer_Click()での処理を以下のようにします。

===== メインモジュール内 =====
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Main()
Dim cBool As clsBool
Dim frmS As frmServer

Set frmS = New frmServer
Set cBool = New clsBool

Load frmS
set frmS.cFlag = cBool
frmS.Show

Do While 1
If cBool.bFlag = true Then
exit Do
Else
DoEvents
Sleep 1000
End If
Loop

AsynchronousClient.Main '非同期サーバ起動

frmS.Hide
Unload frmS
Set frmS = Nothing
Set cBool = Nothing

End Sub

======= frmServerクラス内 =======
private sub btnServer_Click()
cFlag.bflag = true
end sub


> ■文字だけの送受信なら、tcpClientクラスやtcpListnerクラスを使って簡単にできると思うのですが、ファイルの転送もできるのでしょうか?(その際、BinaryWriterとBinaryReaderを使えばいいのでしょうか?)しかし、スレッドを使わないとファイルを送受信している間は、他に何もできないのかも??

VBでファイル転送は経験ありませんが、個人的にはftpを使ったほうがいいような気もします。
明確な回答でなくてごめんなさい。

> ■まず、クラスファイルは追加できたのですがprjServerの起動クラスの項目(clsPrj2)にどうやって追加するのか分かりませんでした。

起動クラスではなく、メインモジュール(Sub Main())でした。誤った情報を教えてしまってすいません。


> ■また、クラスファイルから(またはメインモジュールから)フォームをShowするやり方が分かりませんでした。(frmServer.show()ができませんでした。)

オブジェクト指向の概念を結構無視した作り方ですが、よければ参考にしてください。このやり方で「なんちゃっ...続きを読む

Qソケットプログラミングで・・

簡単なソケットプログラムを作ろうとしておりまして、サイトで調べたりしておりましたところ、なんとか分かってきたのですが、ひとつどうしてもわからないことがありますので教えていただけますでしょうか。
ソケットから受信するメッセージの生成のところなんですが、
「WSAAsyncSelect(m_socket,m_hWnd,WM_USER_ASYNC_SELECT,FD_READ | FD_WRITE)」
で、2番目の引数「m_hWnd」がわかりません。
教えていただけないでしょうか?よろしくお願いします。

Aベストアンサー

こちらの「III.非同期ソケット通信」のところが参考になりませんか?
WSAAsyncSelect()で、例えば受信データありの場合にイベントとして通知する
ウィンドウのハンドルをここに記述しておき、そのウィンドウのイベント
ハンドラで受信処理を行なうようなプログラミングを可能にします。
http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

参考URL:http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

QVBのソケット通信(winsock)のサイト

VBでwinsockコントロールを使ってソケット通信にて、データの送受信をするプログラミングをするのですが、サンプルコードなどが載っているサイト、わかりやすく説明してあるサイトがありましたら教えてください。

Aベストアンサー

ここの履歴にサンプルが載ってます。。。
っていうか載せました。

わかりやすいかどうかは、わかりませんが・・・

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=155606

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qサーバーソケットを開いたまま、PCの電源を切ると・・

サーバーソフトを作った場合に、サーバー
ソケットを開いたまま、電源を切ることは、
問題ないのでしょうか。
再起動時は、どうなるのでしょうか。
(OSが、電源を切る前に アプリケーションの
Dispose()メソッドが呼び出されるのなら、
そこには、ソケットを閉じる、と書いてあるので、
大丈夫なのですが)。
何か分かる人、お願いします。

Aベストアンサー

アプリが強制終了された場合でも同様の疑問にぶち当たるのですが、その場合(シャットダウン、強制終了 共)無事切断されます。

ちなみにソケットは、WinSock を使用しているということでよいですか?
私の場合は、WinSockでしたので。。。

これは、Win32API でも WinSockコントロール でも同様でした。


人気Q&Aランキング

おすすめ情報