ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 07:49

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 00:14 
過去ログに依然に私が作ったメールクライアントがあります。
参考にどうぞ。

http://www.discoversoft.net/wforum/wfor ... =past#1354

多分AB4でもコピペで動くと思います。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 00:14 
ひとつ疑問に思ったのですが、自ホストのポート33001番は何か
稼動していますか?

>server.sin_port = htons(33001)

開いていないポートへは接続できません。
実験なら私がまけイヌさまのページ(http://www.yeah.ne.jp/~losedog2/ab.htm)の
プログラム投稿掲示板に以前投稿した
ネットアプリデバッグツール を使えば一時的にサーバ代わりにも
出来ます。ご活用ください。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 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型変数を入れることによって、サーバプログラムもうまく動きました。
 サーバプログラムを立ち上げ、クライアントプログラムも立ち上げると、うまく文字列が表示されました。よかったです……。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年5月31日(火) 00:14 
>  ダウンロードして、使ってみました(^^)。色々な機能があって、すごいですね……。どうやって作ったんですか?

2年位前にどうにかやってみようと思って相当苦労して作りました。
今でも仕事で使ってたりします。
Sunshineもネットワークプログラミング頑張ってくださいね。

あと、下のリンク切れてますね・・・
どうやら投稿した後にパスを替えたもよう・・・
トップページに紹介されてるおりゃ様の「コードの切れ端」に行けば
過去にここに投稿したFTPのサンプルなんかもあったと思います。
参考にどうぞ。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Semrush [Bot] & ゲスト[28人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean