• 締切済み

ActiveBasic インターネットを通じてソフト間で通信する

AB 4.23.00を使用しています。 今回、ネットワークのプログラムの勉強を始め、とりあえず、 ネットワークを通して、ソフト間で簡単なチャットが出来るものを作ってみようと思い、作り始めました。 以前、CreateMailslot関数などで出来ると思い、探し回ったのですが、どうしても出来ないので、質問させていただいたところ、『それでは出来ない』とのこと(http://oshiete1.goo.ne.jp/qa5833366.html)だったので、 新たな方法を探していたところ、ソケットというものを使えば出来るというようなことが書かれているページを見つけ、早速参考にさせていただいています。 ですが、どうも、構造というか、その辺がよく分かっていないので、 どこにどの値をどう入れればいいのか・・・などがよく分かりません。 送信用のプログラムは、おそらく書けていると思いますが(一応貼らせていただきます)、 受信用のプログラムでちょっとつまずいています。 connect関数の接続先はどう指定すればいいのか、ということです。 ご存知の方、いらっしゃいましたら、ご教授の方、お願いします。 【送信用】 #console #include <api_winsock2.sbp> Declare Function bind Lib "wsock32.dll" (s As Long,ByRef sName As sockaddr,namelen As Long) As Long Declare Function listen Lib "wsock32.dll" (s As Long,backlog As Long) As Long Declare Function accept Lib "wsock32.dll" (s As Long,ByRef addr As sockaddr,ByRef addrlen As Long) As Long Dim wsaData As WSADATA WSAStartup(MAKELONG(2,0),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) If s=0 Then Print "Error-------->Cannot Socket Create" Sleep(-1) End If Dim sar As SOCKADDR With sar .sa_family=AF_INET End With If bind(s,sar,Len(sar))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sarlen As Long Dim news As DWord listen(s,128) news=accept(s,sar,sarlen) Dim buf[256] As Byte recv(news,buf,256,0) send(news,"HELLO",lstrlen("HELLO"),0) closesocket(s) closesocket(news) Print "SENDED" Sleep(-1) ----------------------------------------------------------------- 【受信用(途中まで)】 #console #include <api_winsock2.sbp> Declare Function bind Lib "wsock32.dll" (s As Long,ByRef sName As sockaddr,namelen As Long) As Long Declare Function listen Lib "wsock32.dll" (s As Long,backlog As Long) As Long Declare Function accept Lib "wsock32.dll" (s As Long,ByRef addr As sockaddr,ByRef addrlen As Long) As Long Dim wsaData As WSADATA WSAStartup(MAKELONG(2,0),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) If s=0 Then Print "Error-------->Cannot Socket Create" Sleep(-1) End If Dim sar As SOCKADDR With sar .sa_family=AF_INET End With If bind(s,sar,Len(sar))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sock_sin As SOCKADDR_IN With sock_sin .sin_family=AF_INET End With If connect(s,sock_sin,Len(sock_sin))<>0 Then Print "Error-------->connect ERROR" Sleep(-1) End If

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

>結局listenで接続待ちになっていないようで、すぐにacceptの方に移ってしまい、 >acceptでエラーを返してきます。 動きとしてはそれであっています(実際此方でも同じです) 私が確認したのも listen 関数で該当ポート接続待ちにした状態で Sleep(-1) 関数コールして その時にツールから接続が出来るか確認しただけです (動いていない時接続エラー・動かしてる時接続OKの確認しただけ) その後の動作(プログラミング)はActiveBasicでどのようにやればいいのかわからなかったので・・・・ > Do Loopで抑えておかないといけないのでしょうか? 普通は(かどうか知りませんが大抵の書籍などでは) その後は SelectSocket 関数などを使ってイベント待ち状態として イベントがコールされた時そちらの関数から Accept/Read/Write 等の関数を コールしていると思います (実際私もそのような使い方しかしたことがありませんが やり方によってコールバック関数でもいいかもしれません) これは基本的には 永久ループで accept 呼び続けるのと同じことになるのではないかと思います (いかんせんやったこと無いので自信なし) あくまでCとしてのサンプルになりますが (以下VCで作ったソケット部分の切り貼り 単純に切り貼りしてるので大文字小文字入り乱れてます) メイン側で   Listen();   WSAAsyncSelect(SockSrv, hwnd_maindlg, WM_USERSOCKET_OFFSET, FD_ACCEPT | FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE); // 非ブロッキング型 上記 hwnd_maindlg 側で ON_MESSAGE(WM_USERSOCKET_OFFSET, OnSocketEvent) void C***::OnSocketEvent(WPARAM wParam, LPARAM lParam) {   switch (WSAGETSELECTEVENT(lParam)){   case FD_ACCEPT:     Accept();     break;   case FD_READ: break;   case FD_WRITE: break;   case FD_CONNECT: break;   case FD_CLOSE: break;   default: break;   } } といったような感じです でもって今改めてみたけど質問者さんが書いたコードでポート開放できてるみたいでした

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

構文(文法)も知らないのにやってみました 以下のコードでサーバポートが待ち受け状態になることまでは確認しました (クライアントが接続に成功することを確認) また気が向いたら調べるかもしれないけどあまり期待はしない方がいいです (ここまでで物好きにも数時間かかったので・・・・・さすが文法知らず) テストその他で要らないプリント文などもそのまま載せてますが削除してください Declare Function bind Lib "ws2_32.dll" (s As DWord,ByRef name As SOCKADDR_IN,namelen As Long) As Long Declare Function listen Lib "ws2_32.dll" (s As DWord,backlog As Long) As Long Declare Function accept Lib "ws2_32.dll" (s As DWord,ByRef addr As SOCKADDR_IN,ByRef addrlen As Long) As Long Dim wsaData As WSADATA print wsaData.wVersion WSAStartup(MAKELONG(2,2),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() print wsaData.wVersion Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) Print s, AF_INET, SOCK_STREAM If s=0 Then Print "Error-------->Cannot Create Socket" Sleep(-1) End If Dim sar As SOCKADDR Dim sar_in As SOCKADDR_IN Print sar_in.sin_family FillMemory(VarPtr(sar_in),Len(sar_in),0)   ------ クリアが必要 Print sar_in.sin_family With sar_in .sin_family=AF_INET .sin_port=htons(2000)       -------- とりあえずポート2000でサービス動作                   ------- 1024以下は予約されてるので使ってはいけません rem .sin_addr=htonl(0.0.0.0)    ----- サーバ側なのでとりあえず不要                   ----- クライアントでは inet_addr を使います End With With sar .sa_family=AF_INET End With If bind(s,sar_in,Len(sar_in))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sarlen As Long Dim news As DWord Print "Listn Start" If listen(s,1)=SOCKET_ERROR Then Print "Error-------->LISTEN ERROR" Sleep(-1) End If 接続確認として以下のツールを使用しました http://download.goo.ne.jp/software/contents/soft/win95/net/se296044.html

if-so-at
質問者

お礼

ご回答ありがとうございます。 調べていただき、本当にありがとうございます。 早速、とりあえず、実行の方をさせていただいたのですが、 どうも、listenの部分がよくわかりません。 acceptの前まで上書きさせていただいたのですが、 結局listenで接続待ちになっていないようで、すぐにacceptの方に移ってしまい、 acceptでエラーを返してきます。 これは、実は正しいのでしょうか? Do Loopで抑えておかないといけないのでしょうか? すいませんが、お願いします。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

コネクトできたらそのままsendでデータ送信できるはすです 但し記載コードでは其処まで動いていないと思います クライアント側ではサーバのIPとポート指定してソケット開かないと 動きませんよ 単純なコードの問題ではなくてソケット通信というのがどんな物か 勉強された方がいいのではないかと思います http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

if-so-at
質問者

お礼

ご回答ありがとうございます。 リンク先のページ、拝見させていただきました。 目を通しながら、書き直しているのですが、サーバー側のlisten関数で、接続待ちになりません。(SOCKET_ERRORがすぐに返る) それと、bind関数で、第二パラメータは『SOCKADDR』型となっていますが、 『SOCKADDR_IN』型を、どうやって指定するのでしょう? とりあえず、Declareの定義部分で変えてやっています(これがいけないのかと思いますが・・・) すみませんが、よろしくお願いします。

if-so-at
質問者

補足

サーバー側 #console #include <api_winsock2.sbp> Declare Function bind Lib "wsock32.dll" (s As Long,ByRef sName As sockaddr_in,namelen As Long) As Long Declare Function listen Lib "wsock32.dll" (s As Long,backlog As Long) As Long Declare Function accept Lib "wsock32.dll" (s As Long,ByRef addr As sockaddr,ByRef addrlen As Long) As Long Dim wsaData As WSADATA WSAStartup(MAKELONG(2,0),wsaData) Print "WSAStartup--->"+Date$()+" "+Time$() Dim s As DWord s=socket(AF_INET,SOCK_STREAM,0) If s=0 Then Print "Error-------->Cannot Create Socket" Sleep(-1) End If Dim sar As SOCKADDR Dim sar_in As SOCKADDR_IN With sar_in .sin_family=AF_INET .sin_port=htons(10000) .sin_addr=htonl(0.0.0.0) End With With sar .sa_family=AF_INET End With If bind(s,sar_in,Len(sar_in))<>0 Then Print "Error-------->BIND ERROR" Sleep(-1) End If Dim sarlen As Long Dim news As DWord If listen(s,1)=SOCKET_ERROR Then Print "Error-------->LISTEN ERROR" Sleep(-1) End If news=accept(s,sar,sarlen) If news=INVALID_SOCKET Then Print "Error-------->ACCEPT ERROR" End If Dim buffer[1024] As Byte Dim bErr As Long bErr=recv(news,buffer,1024,MSG_OOB) If bErr=0 or SOCKET_ERROR Then Print "Error-------->RECV ERROR AS "+Str$(bErr) Sleep(-1) End If closesocket(s) closesocket(news)

関連するQ&A

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • ActiveBasic リソースの追加/読み込み

    ActiveBasic 4.23.00 を使用しています。 今回、ファイルの暗号化ソフトを作成しようと思い、手段を考えていたところ、ON ERROR RESUME NEXT様のリソースの追加/読み込みの項目を見つけ、 これでやってみようと作成を始めました。 Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr,bDeleteExistingResources As Long) As Long Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As Long,lpType As BytePtr,lpName As BytePtr,wLanguage As Long,lpData As VoidPtr,cbData As Long) As Long Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As Long,fDiscard As Long) As Long '定数 Const RT_MANIFESTID=1 Const RT_MANIFEST="BINTYPE" Sub MainWnd_CommandButton1_Click() Dim IsUpdate As Long Dim Update As Long Dim temp As String 'EditBoxをチェック Dim Ed1 As Long Dim Ed2 As Long Dim buf1 As BytePtr Dim buf2 As BytePtr Ed1=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1)) Ed2=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox2)) If Ed1=0 Then MessageBox(hMainWnd,"埋め込み用物質が選択されていません","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If If Ed2=0 Then MessageBox(hMainWnd,"埋め込み先物質が選択されていません","Error 2",MB_OK or MB_ICONHAND) Exit Sub End If buf1=malloc(Ed1+1) buf2=malloc(Ed2+1) GetDlgItemText(hMainWnd,EditBox1,buf1,Ed1) GetDlgItemText(hMainWnd,EditBox2,buf2,Ed2) temp=MakeStr(buf2) IsUpdate=BeginUpdateResource(buf1,TRUE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe" If IsUpdate=0 Then'エラー free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み先に異常あり","Error 3",MB_OK or MB_ICONHAND) Exit Sub EndIf Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),temp,Len(temp)) If Update=0 Then'エラー EndUpdateResource(IsUpdate,TRUE) free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み時に異常事態発生","Error 4",MB_OK or MB_ICONHAND) Exit Sub End If EndUpdateResource(IsUpdate,FALSE) free(buf1) free(buf2) MessageBox(hMainWnd,"たぶんエラーなく書き込みを完了しました。","Success!!",MB_OK or MB_ICONINFORMATION) End Sub このように書いてみたのですが、IsUpdate=0でいつもエラーが返ってきます。 何故かが分かりません。 すみませんが、ご存知の方がいらっしゃいましたら、ご教授の方をお願いします。

  • activebasicについて

    activebasicの中級者のものです。 ActivebasicにてWindowsPCのログイン中のユーザー名というのは取得できるのでしょうか。 Activebasicのヘルプを見て、サンプルコードをコピー、コンパイルしたものの、エラーが大量発生し、、、、。 ということでお願いします_(._.)_ 【サンプルコード】 http://www.activebasic.com/help_center/Pages/API/SystemService/SystemInformation/GetUserName.htm Declare Function GetUserName Lib "kernel32" Alias "GetUserNameA" _ (lpBuffer As BytePtr, _ ByRef nSize As Long) As Long lpBuffer 【ページ内の解説の意味もさっぱり分かりません(´;ω;`)】 Win32API: GetUserName ユーザー名を取得します。 定義 Declare Function GetUserName Lib "kernel32" Alias "GetUserNameA" _ (lpBuffer As BytePtr, _ ByRef nSize As Long) As Long lpBuffer 文字列バッファへのポインタを指定します。このバッファにユーザー名が格納されます。 nSize (ポインタ参照) lpBuffer パラメータで指定したバッファのバイト数が格納されている、32ビット整数型変数へのポインタを指定します。 関数が成功すると、取得したユーザー名のバイト数が格納されます。 戻り値 関数が成功すると、TRUE が返ります。失敗すると、FALSE が返ります。 環境情報 インクルード ファイル: api_system.sbp 内で定義済み DLLファイル: advapi32.dll よろしくお願いいたします。

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • UDP通信について

    UDP通信で困っています。 TCP/IP通信はすぐにうまくいったのですが、 UDPの簡単なサンプルがちゃんと動きません。 間違いがあればご指摘ください。 よろしくお願いします。 (クライアント側ソース int sock; struct sockaddr_in din; memset(&din, 0, sizeof(din)); din.sin_port = htons(50050); din.sin_family = AF_INET; din.sin_addr.s_addr = inet_addr("サーバーIP"); sock = socket(AF_INET, SOCK_DGRAM, 0); int buf = 12345; sendto(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&din,sizeof(struct sockaddr_in)); (サーバー側ソース int sock; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(50050); sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { return(1); } struct sockaddr_in fromaddr; socklen_t len = sizeof(struct sockaddr_in); int buf; recvfrom(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&fromaddr,&len); printf("recv:%d\n",buf);

  • ActiveBasic 再描写処理が読み出されても、描写していた物を削除しない方法

    ActiveBasic4.23.00を使ってプログラムを書いています。 例えば、次のようなコードがあったとします。 'グローバル Dim DragFlag As Long Dim hDC As HDC '此処まで Sub MainWnd_Destroy() ReleaseDC(hMainWnd,hDC) test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) hDC = GetDC(hMainWnd) End Sub Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) DragFlag = 1 MoveToEx(hDC,x,y,ByVal NULL) End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If DragFlag = 0 Then Exit Sub LineTo(hDC,x,y) End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) DragFlag = 0 End Sub (ABWiki様を参考にさせていただきました。) これで、簡単なお絵かきが出来ますが、再描写(例えば、ウインドウの大きさを変えるなど)をするとすべて消えてしまいます。 これを、描いた線を消さずに再描写することは出来ないのでしょうか。 すみませんがご教授ください。

  • UDP通信について

    前回のことでかなり言われたので改変版を見てもらいたいと思います。 TCPと伝えていましたが今回、UDPに変えました。 ヘッダーはこのようになっております。 ==wsock.h== #include <Windows.h> #include <stdio.h> #pragma comment(lib,"WSock32.lib") #define PORT_NO 8000 ポート番号 #define SERVER_NAME "" enum MINE{ NONE, SERVER, CLIENT }; ソケット通信 class WSOCK{ private: WSADATA wsaData; SOCKET s; SOCKADDR_IN saddr; int rtn; int state; MINE mineFlg; char szStr[256]; エラーメッセージ用 u_short port; 変換後のポート番号 int fromlen; 受信したサイズ HOSTENT *lpHost; ホスト情報 ファイルディスクプリタをまとめた構造体 //→ソケット判別する為の管理情報 fd_set fds,readfds; public: char szRcvBuf[1024]; 受信バッファ char szSndBuf[1024]; 送信バッファ SOCKADDR_IN from; ソケットアドレス構造体 WSOCK(); ~WSOCK(); bool ServerRcv(); 受信 bool ServerSnd();送信 bool CliantRcv();受信 bool CliantSnd();送信 void SarverSet(); void ClientSet(); bool EnumMyIPAddress(); }; ==wsock.cpp== #include "wsock.h" コンストラクタ WSOCK::WSOCK(){ //WinSock初期化 rtn = WSAStartup(MAKEWORD(2,2),&wsaData); if(rtn != 0){ MessageBox(NULL,"WSAStartup失敗", "ERROR",MB_OK); state = -1; } ソケットを開く s = socket(AF_INET,SOCK_DGRAM,0); if(s<0){ MessageBox(NULL,"ソケットをオープンできません", "eRROR",MB_OK); WSACleanup(); state = 2; } 0で初期化 memset(&saddr,0,sizeof(SOCKADDR_IN)); saddr.sin_family = AF_INET;//アドレスファミリー saddr.sin_port = htons(PORT_NO);//ポート mineFlg = SERVER; サーバ側設定 if(mineFlg == SERVER) { SarverSet(); } if(mineFlg == CLIENT) {クライアント ClientSet(); } } WSOCK::~WSOCK(){ closesocket(s); ソケットのリソース解放 rtn = WSACleanup(); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"WSACleanup失敗","ERrOR",MB_OK); state = -2; } } //受信 bool WSOCK::ServerRcv(){ 読み込み用fd_setの初期化 selectが毎回内容を上書きしてしまうので毎回初期化 memcpy(&fds,&readfds,sizeof(fd_set)); struct timeval timeout = {0,0};   //{1秒以上の部分()s、1秒以下の部分(ms)} fdsに設定されたソケットが読み込み可能になるまで待つ select(0,&fds,NULL,NULL,&timeout); ソケット読み込み可能データがある場合 if(FD_ISSET(s,&fds)){ fromlen = (int)sizeof(from); //nullで初期化 memset(szRcvBuf,'\0',sizeof(szRcvBuf)); //受信処理 rtn = recvfrom(s,szRcvBuf,(int)sizeof(szRcvBuf)-1,0, (SOCKADDR*)&from,&fromlen); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"recvfromエラー","ERRoR",MB_OK); return false; } } szRcvBuf[rtn] | '\0';//NULLコード if(strcmp(szRcvBuf,"c_end") == 0){ MessageBox(NULL,"クライアントが接続を切りました","ERROr",MB_OK); return false; } return true; } 送信 bool WSOCK::ServerSnd(){ char buf[1024]; memset(buf,0,sizeof(buf)); //_snprintf:書式指定文字付きデータ書き込み _snprintf(buf,sizeof(buf),"data to port 8000"); //送信処理 rtn = sendto(s,szSndBuf,(int)strlen(szSndBuf)+1, 0,(LPSOCKADDR)&from, 送り先サーバ/クライアント sizeof(from)); サイズ if(rtn != (int)strlen(szSndBuf)+1){ MessageBox(NULL,"sendtoエラー","サーバーエラ",MB_OK); closesocket(s); WSACleanup(); return false; } return true; } 受信 bool WSOCK::CliantRcv(){ fromlen = (int)sizeof(from); //nullで初期化 memset(szRcvBuf,'\0',sizeof(szRcvBuf)); //受信処理 rtn = recvfrom(s,szRcvBuf,(int)sizeof(szRcvBuf)-1,0, (SOCKADDR*)&from,&fromlen); if(rtn == SOCKET_ERROR){ MessageBox(NULL,"recvfromエラー","ERRoR",MB_OK); return false; } szRcvBuf[rtn] | '\0'; //NULLコード if(strcmp(szRcvBuf,"s_end") == 0){ MessageBox(NULL,"接続を切りました","ERROr",MB_OK); return false; } return true; } 送信 bool WSOCK::CliantSnd(){ 送信処理 rtn = sendto(s,szSndBuf,(int)strlen(szSndBuf)+1, 0,(LPSOCKADDR)&saddr, 送り先サーバ/クライアント sizeof(saddr)); サイズ if(rtn != (int)strlen(szSndBuf)+1){ MessageBox(NULL,"sendtoエラー","erROR",MB_OK); closesocket(s); WSACleanup(); return false; } return true; } void WSOCK::SarverSet(){ saddr.sin_addr.s_addr = htonl(INADDR_ANY); ソケットにローカルアドレスを関連付ける if(bind(s,(LPSOCKADDR)&saddr, (int)sizeof(saddr)) == SOCKET_ERROR){ MessageBox(NULL,"bindエラー","er",MB_OK); closesocket(s); WSACleanup(); state = -3; } FD_ZERO(&readfds); FD_SET(s,&readfds); } void WSOCK::ClientSet(){    クライアント側設定    ホスト名からホスト情報を取得 lpHost = gethostbyname(SERVER_NAME); サーバのアドレスをセット memcpy(&(saddr.sin_addr), lpHost->h_addr_list[0], //サーバのアドレス lpHost->h_length); } となっております。

  • コンソールアプリケーションで通信したい

    クライエントプログラムを起動もしていないのに、アクセスがありましたと表示されます。 どこが悪いのか教えてくださいませんでしょうか? サーバー側 #include <stdio.h> #include <winsock2.h> int main() { WSADATA wsaData; LPHOSTENT host; SOCKET s; SOCKADDR_IN name = { AF_INET } , client; int client_addr=sizeof(SOCKADDR_IN); SOCKADDR_IN addr,addr2; addr.sin_family=AF_INET; addr.sin_port=2048; IN_ADDR ip;//実際と異なるアドレス ip.S_un.S_un_b.s_b1=180; ip.S_un.S_un_b.s_b2=328; ip.S_un.S_un_b.s_b3=9; ip.S_un.S_un_b.s_b4=56; addr.sin_addr=ip; WSAStartup(2 , &wsaData); s = socket(AF_INET , SOCK_STREAM , 0); bind(s , (SOCKADDR *)&addr , sizeof(addr)); listen(s , 1); int sizeaddr2=sizeof(addr2); accept(s , (SOCKADDR *)&addr2 , &sizeaddr2); printf("アクセスがありました\nポート %d : アドレス = %s\n" ,addr.sin_port , inet_ntoa(addr.sin_addr)); shutdown(s , SD_BOTH); closesocket(s); WSACleanup(); getchar(); return 0; } クライエント側 #include <stdio.h> #include <winsock2.h> int main() { while(1) { WSADATA wsaData; SOCKET s; WSAStartup(2 , &wsaData); s = socket(AF_INET,SOCK_STREAM , 0); IN_ADDR ip;//実際と異なるアドレス ip.S_un.S_un_b.s_b1=180; ip.S_un.S_un_b.s_b2=328; ip.S_un.S_un_b.s_b3=9; ip.S_un.S_un_b.s_b4=57; SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=2048; addr.sin_addr=ip; connect(s,(PSOCKADDR)&addr,sizeof(SOCKADDR)); send(s,"OK",3,0); shutdown(s , SD_BOTH); closesocket(s); WSACleanup(); } return 0; }

  • ActiveBasic リソースの追加と読み込み

    ActiveBasic 4.23.00を使用しています。 以前、リソースの追加方法を教授していただきました。 リソースの追加と言うものは出来るようになったのですが、 文字列の都合上、以前の質問を使用させていただきます。 http://oshiete1.goo.ne.jp/qa4983148.html 上のコードを使用しているのですが、これだとやはり、『文字列』しか追加できないのでしょうか。 zip等のファイルを追加していきたいと思っているのですが、どのようにすればよろしいのでしょうか。 また、このコードを使用して、リソースをプログラムBに追加したところ、 プログラムBのアイコンが消えてしまいました。 これは、何か回避する方法があるのでしょうか。 最後に、 Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As DWord,lpName As BytePtr,lpType As BytePtr) As DWord Declare Function FreeResource Lib "kernel32" (hResData As DWord) As DWord Declare Function SizeofResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LoadResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LockResource Lib "kernel32" (hResData As DWord) As Long Const RT_MANIFESTID=50'埋め込んだ時と同じIDにしてください Const RT_MANIFEST="BINTYPE" Dim FileName[MAX_PATH] As Byte Dim hDLL As DWord, hResource As DWord, lResource As DWord Dim File As BytePtr GetModuleFileName(NULL,FileName,MAX_PATH) hDLL=LoadLibrary(FileName) If hDLL=0 Then MessageBox(hMainWnd,"ファイルの取得に失敗","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If hResource=FindResource(hDLL,RT_MANIFESTID,RT_MANIFEST) If hResource=0 Then FreeLibrary(hDLL) MessageBox(hMainWnd,"ファイルの取り出しに失敗!","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If lResource=LoadResource(hDLL,hResource) File=LockResource(lResource) FreeResource(lResource) FreeLibrary(hDLL) プログラムBに追加した物を取り出すプログラムですが、これはプログラムBに書きました。 実行すると、読み出しの部分でエラーが生じるのですが、どのように回避していけばよろしいのでしょうか。 長々と多くの質問をしてしまいすみません。 しかし、全然解決できずにもやもやしていて困っています。 何かやり方をご存知の方がいらっしゃいましたらご教授をお願いします。

  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

専門家に質問してみよう