ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ネットワークについて https://www.activebasic.com/forum/viewtopic.php?t=29 |
ページ 1 / 1 |
作成者: | Sunshine [ 2005年5月31日(火) 00:13 ] |
記事の件名: | ネットワークについて |
そろそろネットワークプログラミングの勉強もしなきゃいけないと思い、ネットなどでいろいろと調べているのですが、全く分かりません。 一応、サーバとクライアントプログラムを作ってみました。……動きません。どうすればいいのでしょうか。そもそも、作った後どうすればいいのか全く分かりません。 ネットワークについては超初心者なので、どうかよろしくお願いします。 長くなりますが、ソースを一応載せておきます。 ↓サーバ----------------------------------------------------- #include <api_mmsys.sbp> #include <api_commctrl.sbp> #include <api_winsock2.sbp> ' TCPサーバ Declare Function listen Lib "wsock32.dll" (ByVal s As Long, ByVal backlog As Long) As Long Declare Function bind Lib "wsock32.dll" (ByVal s As Long,ByRef sName As SOCKADDR_IN, ByVal namelen As Long) As Long Declare Function accept Lib "wsock32.dll" (ByVal s As Long,ByRef addr As SOCKADDR_IN,ByVal addrlen As Long) As Long Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long Dim wsaData As WSADATA Dim wsaErr As Long Dim sock As DWord Dim sock0 As DWord Dim addr As SOCKADDR_IN Dim client As SOCKADDR_IN Dim buffer[31] As Byte 'Winsock2の初期化 wsaErr = WSAStartup(MAKEWORD(2,0), wsaData) Select Case wsaErr Case WSASYSNOTREADY MessageBox(0, Ex"接続できません。\nネットワークの準備ができていません。", "接続エラー", MB_ICONINFORMATION or MB_OK) End Case WSAVERNOTSUPPORTED MessageBox(0, Ex"接続できません。\n要求されたwinsockのバージョンがサポートされていません。", "接続エラー", MB_ICONWARNING or MB_OK) End Case WSAEINPROGRESS MessageBox(0, Ex"接続できません。\nブロッキング操作の実行中か、またはサービスプロバイダがコールバック関数を処理しています。", "接続エラー", MB_ICONWARNING or MB_OK) End Case WSAEPROCLIM MessageBox(0, Ex"接続できません。\nwinsockが処理できる最大プロセス数に達しています。", "接続エラー", MB_ICONWARNING or MB_OK) End End Select 'ソケット作成 sock0 = socket(AF_INET, SOCK_STREAM, 0) If sock0 = INVALID_SOCKET Then MessageBox(0, "ソケットの作成に失敗しました。", "接続エラー", MB_ICONWARNING or MB_OK) WSACleanup() End End If 'ソケット設定 addr.sin_family = AF_INET addr.sin_port = htons(33001) addr.sin_addr = 0 '誰でもいいから If bind(sock0, addr, 16) = -1 Then MessageBox(0, "ソケットの設定に失敗しました。", "接続エラー", MB_ICONWARNING or MB_OK) WSACleanup() End End If '待機状態にする listen(sock0, 16) While 1 '接続要求受付 sock = accept(sock0, client, 15) If sock = INVALID_SOCKET Then MessageBox(0, "クライアントソケットの作成に失敗しました。", "接続エラー", MB_ICONWARNING or MB_OK) WSACleanup() End End If 'TCPクライアントへの送信 ZeroMemory(buffer, 32) send(sock, "Hello Winsock!!", 15, 0) 'TCPセッションの終了 closesocket(sock) WEnd 'Winsock2終了 WSACleanup() End ↓クライアント----------------------------------------------- #include <api_mmsys.sbp> #include <api_commctrl.sbp> #include <api_winsock2.sbp> ' TCPクライアント Declare Function listen Lib "wsock32.dll" (ByVal s As Long, ByVal backlog As Long) As Long Declare Function bind Lib "wsock32.dll" (ByVal s As Long,ByRef sName As SOCKADDR_IN, ByVal namelen As Long) As Long Declare Function accept Lib "wsock32.dll" (ByVal s As Long,ByRef addr As SOCKADDR_IN,ByVal addrlen As Long) As Long Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long Dim wsaData As WSADATA Dim wsaErr As Long Dim sock As DWord Dim server As SOCKADDR_IN Dim buffer[31] As Byte 'Winsock2の初期化 wsaErr = WSAStartup(MAKEWORD(2,0), wsaData) Select Case wsaErr Case WSASYSNOTREADY MessageBox(0, Ex"接続できません。\nネットワークの準備ができていません。", "接続エラー", MB_ICONINFORMATION or MB_OK) End Case WSAVERNOTSUPPORTED MessageBox(0, Ex"接続できません。\n要求されたwinsockのバージョンがサポートされていません。", "接続エラー", MB_ICONWARNING or MB_OK) End Case WSAEINPROGRESS MessageBox(0, Ex"接続できません。\nブロッキング操作の実行中か、またはサービスプロバイダがコールバック関数を処理しています。", "接続エラー", MB_ICONWARNING or MB_OK) End Case WSAEPROCLIM MessageBox(0, Ex"接続できません。\nwinsockが処理できる最大プロセス数に達しています。", "接続エラー", MB_ICONWARNING or MB_OK) End End Select 'ソケット作成 sock = socket(AF_INET, SOCK_STREAM, 0) If sock = INVALID_SOCKET Then MessageBox(0, "ソケットの作成に失敗しました。", "接続エラー", MB_ICONWARNING or MB_OK) WSACleanup() End End If '接続先指定 server.sin_family = AF_INET server.sin_port = htons(33001) server.sin_addr = inet_addr("127.0.0.1") '自分自身 'サーバに接続 If connect(sock, server, 16) = SOCKET_ERROR Then MessageBox(0, "サーバとの接続に失敗しました。", "接続エラー", MB_ICONWARNING or MB_OK) closesocket(sock) WSACleanup() End End If '受信 ZeroMemory(buffer, 32) recv(sock, buffer, 32, 0) '受信内容表示 MessageBox(0, buffer, "受信内容", MB_OK) 'Winsock2終了 closesocket(sock) WSACleanup() End |
作成者: | situmon [ 2005年5月31日(火) 00:14 ] |
記事の件名: | |
過去ログに依然に私が作ったメールクライアントがあります。 参考にどうぞ。 http://www.discoversoft.net/wforum/wfor ... =past#1354 多分AB4でもコピペで動くと思います。 |
作成者: | situmon [ 2005年5月31日(火) 00:14 ] |
記事の件名: | |
ひとつ疑問に思ったのですが、自ホストのポート33001番は何か 稼動していますか? >server.sin_port = htons(33001) 開いていないポートへは接続できません。 実験なら私がまけイヌさまのページ(http://www.yeah.ne.jp/~losedog2/ab.htm)の プログラム投稿掲示板に以前投稿した ネットアプリデバッグツール を使えば一時的にサーバ代わりにも 出来ます。ご活用ください。 |
作成者: | Sunshine [ 2005年5月31日(火) 00:14 ] |
記事の件名: | |
> 実験なら私がまけイヌさまのページ(http://www.yeah.ne.jp/~losedog2/ab.htm)の > プログラム投稿掲示板に以前投稿した > ネットアプリデバッグツール を使えば一時的にサーバ代わりにも > 出来ます。ご活用ください。 ダウンロードして、使ってみました(^^)。色々な機能があって、すごいですね……。どうやって作ったんですか? サーバプログラムのバグも発見できました。 >> Declare Function accept Lib "wsock32.dll" (ByVal s As Long,ByRef addr As SOCKADDR_IN,ByVal addrlen As Long) As Long の ByVal addrlen As Long が、 ByRef addrlen As Long で、ポインタ参照でした。 これで、ここに仮のLong型変数を入れることによって、サーバプログラムもうまく動きました。 サーバプログラムを立ち上げ、クライアントプログラムも立ち上げると、うまく文字列が表示されました。よかったです……。 |
作成者: | situmon [ 2005年5月31日(火) 00:14 ] |
記事の件名: | |
> ダウンロードして、使ってみました(^^)。色々な機能があって、すごいですね……。どうやって作ったんですか? 2年位前にどうにかやってみようと思って相当苦労して作りました。 今でも仕事で使ってたりします。 Sunshineもネットワークプログラミング頑張ってくださいね。 あと、下のリンク切れてますね・・・ どうやら投稿した後にパスを替えたもよう・・・ トップページに紹介されてるおりゃ様の「コードの切れ端」に行けば 過去にここに投稿したFTPのサンプルなんかもあったと思います。 参考にどうぞ。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |