• 締切済み

ソケットで通信できない

Solaris + C で作成したプログラムAと、 PC上のVBで作成されたアプリBとの通信を行おうとしていま。 PC側のVBで、 Winsock.LocalPort = 3000 Winsock.Listen の処理があります。 Aではソケットの生成(socket)→接続(connest)→書込み(write)を行っていますが、すべて成功している模様です。 ・・が、VB側のWinsock_DataArrivaでブレークしていても、一向に受信する気配がありません。 VB及びソケットに関して、ほとんど知識がないので上記処理であっているかも分かっていません。 解決策をご存知の方がおられましたら、ご教授願いたく。

  • mkob
  • お礼率36% (18/50)

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> Winsock.LocalPort = 3000 > Winsock.Listen > の処理があります Winsock.Acceptの処理は? ポート決め→リスン→(接続要求があれば)アクセプト→送受信→クローズ というのが一般的な流れだ。アクセプトの処理が無ければ当然サーバ側はDataArrivalにが来ない。 できればもう少しVB側のWinsock処理を明確に説明すべきだろう。何をやって「何をやってない」のか。

mkob
質問者

お礼

回答ありがとうございます。 >できればもう少しVB側のWinsock処理を明確に説明すべきだろう。 言われる通りですが、ほんとに記載した処理しかなかったんですよ。 何をすべきで、何が足らないのかすらわかってませんでした。 頂いた回答をヒントに調べて、なんとか解決しました。 ありがとうございました。

関連するQ&A

  • UDP/IPでのソケット作成について(winsock)

    UDP/IPでのソケット作成について(winsock) 開発環境VC++.NET、O/S WIN2000にてソケットプログラミング(winsock2.0)をしています。 コンソールプログラミングではありませんが、WindProcは持っていません。 UDPサーバーを作り、複数クライアントの対応をしたいと考えています。 クライアントAからの通信やりとり中に クライアントBからの通信がきたら、そちらとも通信やりとりを(自動で)行いたい。 ここで問題なのが、クライアントAの要求ポートが15000で、 クライアントBの要求ポートも15000なのです。 同じ既に開いているポートでソケット作成しようとしても、socket()関数はエラーを返してくるのですが、 やり方を工夫すれば、同一ポートでの複数クライアント対応は可能なのでしょうか。不可能なのでしょうか。 可能であれば、やり方、ヒント等教えてください。よろしくお願いします。 追記 (1)TCP/IPでは、同一ポートでソケット作成が可能でした。ネットで探したサンプルプログラムが  そのような動きをしていたのですが、UDPに書換えることはできませんでした。  http://eternalwindows.jp/network/winsock/winsock04s.html (2)UNIXの場合fork()処理後に socket()作成 → bind()で同一ポートでの複数クライアント対応が  上手くいくらしいのですが、Windowsではマルチスレッド等をうまく活用すれば、  fork()と同様の処理が可能になり、目的が達成できるでしょうか。

  • VC6.0ソケット通信プログラムについて

    お世話になります。 VC6.0でソケット通信の社内の既存のプログラムを改善しております。 クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。 NETSTATコマンドで確認したところ、 サーバ側では、CLOSE_WAITが大量に出力されており クライアント側では、FIN_WAIT_2が大量に出力されます。 クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。 サーバ側のEXEを再起動すると、CLOSE_WAITは消えます。 サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。 コードを以下に記述致します。 WINAPI K010cListener{ /*Winsock初期化*/ WSAStartup(wVersionRequested,&wsaData); /*SOCKET作成*/ fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) /*ポートの設定*/ addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port = htons(usPortNo); addrlen = sizeof(addr); /*BIND*/ bind(fd,(struct sockaddr*)&addr,addrlen) /*LISTEN*/ listen(fd,0) while(1){ /*ACCEPT*/ fd2 = accept(fd,(struct sockaddr*)&addr,&addrlen) //データ受信 waitReceiveThread(fd2, &rcv_msg); //DBオープン ConnectDB() //DB登録 AddTable(&rcv_msg) //DBクローズ CloseDB() } /*Winsock終了*/ WSACleanup(); } void waitReceiveThread(SOCKET fd, SockRcvMsg *rcv_msg) { while (1) { /*データ受信待ち*/ rcvSize = recv(fd,rcvBuf,sizeof(rcvBuf),0); if (rcvSize <= 0) { continue; } else { /* 返信電文の準備 */ memset(sndBuf,0x20,sizeof(sndBuf)); memcpy(sndBuf ,"RCMORDER00004800000000",22); /* 返信電文の送信 */ send(fd,(char*)sndBuf,sizeof(sndBuf),0); /* バッファの初期化 */ bufsize=0; memset(buf,'\0',sizeof(buf)); break; /*ループを抜ける*/ } } } 恐れ入りますが、ご教授いただければ幸いです。 宜しくお願い申し上げます。

  • VB6‥ソケットについて

    MS-VB6 SP6 を使って作業をしております。 Winsock を使って、複数のユーザー対応のチャットを 作成していまして…複数接続を行うために ソケットを使おうと考えております。 …しかしネットやヘルプで調べましたが、よくわかりません ソケットの作成方法・利用方法や実際のサンプル… などありましたら、教えてください。 また、他にもネットワークを介してのアプリケーション 開発において、アドバイスなどありましたら そちらの方もお願い致します。 P.S.  Winsock のプロトコルは、TCPを使用しています。

  • Androidのソケット通信(初歩)

    Androidでソケット通信を行いたいなのですが エミュレータ環境でも実機環境でもうまく動作しません。 何かを送信するまでもなくソケット作成の時点で落ちてしまいます。 通常のJavaプログラム間でなら通信できるのですが、何かやり方が間違っているのでしょうか? (1)PC側でJavaのサーバプログラムを起動しておく。 (2)Androidのエミュレータあるいは実機で起動 (3)Androidのボタンを押してソケット作成(下記プログラムが実行される) (4)Android側が強制終了する 以下の単純なプログラムを使用しています。 また、IP、Portは正しくファイアウォールも無効にしています。 Socket socket = null; try { socket = new Socket("***.***.***.***", ****); } catch (UnknownHostException e) { System.err.println("Don't know about host"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to host"); }

    • ベストアンサー
    • Java
  • ソケット通信での再接続

    ソケット通信での再接続 ソケット通信でサーバ側は立ち上げたまま、 クライアント側を同じポート番号で 何度も再接続できるようにしたいと考えております。 http://blog.livedoor.jp/akf0/archives/51585502.html を参考にマルチスレッドを利用してプログラムを作成してみましたが 最初の起動に関してはうまくいくのですが、 クライアント側を一度終了してもう一度再接続すると、 バインドエラーが出ます。 いろいろ試してみたのですが、 どうしてもうまくいきません。 どうすればいいのでしょうか。 ご存じの方がいらっしゃればお答えいただきたいと思っております。 よろしくお願いいたします。 環境 OS:Windows XP 開発環境:Visual Studio 2008 Express Edition ソケット通信:winsock2 マルチスレッド:win32api

  • winsock通信時エラーの回避

    winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。 サーバー側(winsock部分)記述 Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Winsock1(Index).Close '接続を閉じる Do While Not (Winsock1(Index).State = sckClosed) DoEvents Loop On Error Resume Next Winsock1(Index).Listen If Winsock1(Index).LocalPort <> 0 Then Winsock1(Index).LocalPort = 0 End If End Sub 質問の整理ですが、 表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。 で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。 また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

  • ソケット通信時のWSACleanup処理のエラーについて

    はじめまして。 現在、C++ Builder ver6.0 にて、ソケット通信のプログラムを作成しているのですが、受信処理を一定回数行うとwinsockのリソースを解放するWSACleanupが失敗してしまいます。1ファイル受信するごとに下記のソケットの初期化処理を入れています。 bool __fastcall CUdpSock::Init(void) {   WORD wVersionRequested; // socket version   int errorStatus;   WSADATA wsaData;   /* WinSockの初期化を行う */   wVersionRequested = MAKEWORD(1, 1); // バージョン 1.1 を要求する   nErrorStatus = WSAStartup(wVersionRequested, &wsaData);   if ( nErrorStatus != 0 )   {     m_msg.printf("WinSockの初期化失敗\n");     Application->MessageBox(m_msg.c_str(), "ソケットの初期化", MB_ICONINFORMATION | MB_OK);     return false;   }   if (atexit((void (*)(void))(WSACleanup))) // 終了時にWinSockのリソースを解放するようにしておく   {     m_msg.printf("atexit(WSACleanup)失敗\n");     Application->MessageBox(m_msg.c_str(), "ソケットの初期化", MB_ICONINFORMATION | MB_OK);     return false;   }   return true; } 現状、32回連続で受信した後、上記のWSACleanupで失敗になっています。 このような現象の場合、まずどのあたりを疑うべきでしょうか? 曖昧ですがご教授よろしくお願いします。

  • WinSockのソケットからウィンドウへのメッセージで・・・

    こんばんは、このたびWinSockを用いたネットワークゲームを作成しようと考えたのですが、サーバー側がクライアントの接続ごとにソケットを立て、そのメッセージをすべて同じウィンドウへ返すようにしているのですが、それではどのソケットからメッセージが来たのか分からず、どのソケットをレシーブすればいいのか分かりません。 こういう場合の有効的な手段って何かないですか? 分かりにくい質問ですみません。どなたかお願いしますm(_ _)m

  • Access2010にてソケット通信

    Win7Pro+Access2010 にて業務システムを構築しています。 同一LAN内で10台~20台で使用しています。 Access2010から、別の業務アプリへソケット通信にて テキストデータを伝送したいと考えております。 (業務アプリはソケット通信でしかデータを受け取れないです) 2点質問があります。 (一つ目) Microsoft Winsock Control 6.0 (mswinsck.ocx) を 用いる方法が出てきたのですが、これはVB6Proが無いと ライセンス上使用できないのですよね・・・? この場合ライセンスが必要なのは開発者のPCだけでしょうか。 なお、他の端末はAccess2010ランタイムパッケージにて 稼働しております。 (二つ目) 上のmswinsck.ocxが使えない場合、他の方法としては 何があるのでしょうか。参考サイトなど含めて教えて頂けると 助かります。 ※VBAは理解できます。 宜しくお願い致します。

  • 初歩的なソケット通信(java)

    初歩的なソケット通信(java) javaのソケット通信プログラムについて質問させて頂きます。まだまだ基礎の段階なのですが、詰まってしまたので、良かったら教えてください。 以下プログラムコード ------------------------------------- //サーバー側 import java.net.*; import java.io.*; public class Server { static int port = 12345; public static void main(String[] args) { try{ //サーバソケットの作成 ServerSocket ssoc = new ServerSocket(port); //メインループ while(true){ try{ System.out.println("クライアントからの接続を"+ port +"で待ちます"); Socket soc = ssoc.accept(); System.out.println(soc.getInetAddress().getHostName()+"から接続を受けました"); //処理をスレッドに任せます new Connect(soc); }catch(IOException e1){ e1.printStackTrace(); } } }catch(IOException e2){ e2.printStackTrace(); } } } class Connect extends Thread{ private Socket socket = null; public Connect(Socket socket){ this.socket = socket; //スレッド開始 this.start(); } public void run(){ try{ //出力ストリームを取得 OutputStream os = socket.getOutputStream(); PrintWriter out = new PrintWriter(os,true); //入力ストリームを取得 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader in = new BufferedReader(isr); String inputLine; while((inputLine = in.readLine()) != null){ //System.out.println(inputLine); out.println(inputLine); } System.out.println("処理が終わったので接続を切ります"); in.close(); out.close(); socket.close(); }catch(Exception e1){ try{ socket.close(); }catch(Exception e2){ e2.printStackTrace(); } } } }