Win32 Applicationで通信するには


ロキ  2006-06-12 20:46:31  No: 62153

Win32 ApplicationでIPとホスト、相手に送るデータサイズ、そのデータを何度送るか言う入力欄があり送信ボタンで入力したIPのホストにデータを送り相手から受け取ったデータを表示するウィンドウを出すと言うのが作りたいのですがWin32 Applicationを使った事が無いのですが金曜までに作らねばならないのですがどなたか参考になる所等を教えていただけないでしょうか?
もし作ってくれる方が居たらありがたいです


KING・王  2006-06-12 21:26:11  No: 62154

> Win32 Applicationを使った事が無いのですが
ロキさんは、Win32 Applicationで無ければ、コンソールでなら通信するソフトの作成可能ですか?or作成できているのですか?

それなら、定番のここのWindows SDK編第1部でも読んで、UI周りを少し勉強すれば簡単に作成できるでしょう。
http://www.kumei.ne.jp/c_lang/

> もし作ってくれる方が居たらありがたいです
どっかのソフト会社にでも有償で依頼すれば?
詳細な仕様は分からないが、1人月分も支払えば簡単なものなら作成してくれるおでは?

通信関係がわからないのなら、とりあえず、このページでも参考に。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/


ロキ  2006-06-12 22:19:42  No: 62155

DOS画面上でなら通信できる物は作りましたがコンソールは・・

おかねは使いたくないですし無いです…


REE  2006-06-13 03:06:30  No: 62156

DOS画面上≒コンソールです。

KING・王さんのお勧めページなどを見て、自力でがんばってくださいね。

もちろんピンポイントでこの掲示板で質問するのはOKですよ。


PATIO  2006-06-16 00:34:37  No: 62157

お勉強目的なら自分でやるべきでしょうし、
お客に提出するような物ならそれなりの物を要求されるでしょうから
ただで作ってもらったような物を出すべきではないかと。

いずれにせよ、自分で頑張りましょう。


フール  2006-06-16 20:15:29  No: 62158

とりあえず自分で下記のような感じで作ったのですが
error C2664: 'inet_addr' : 1 番目の引数を 'struct HWND__ *' から 'const char *' に変換できません。
と言うようなエラーが出て進まないのですがこのエラーを回避するのはどうしたらいいか教えてください…

#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "resource.h"
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>

#define SIZE 1000

  WSADATA wsadata;
  WORD wversion = MAKEWORD( 2, 0);
  SOCKET c_socket;
  struct sockaddr_in client;
  int nError;

BOOL CALLBACK DlgProc(HWND hDlg,UINT Msg, WPARAM wParam, LPARAM lParam)
{

char str[256];
  char a[SIZE];
  char data[SIZE];

    switch(Msg)
    {
    case WM_INITDIALOG:
        SetDlgItemText(hDlg,IDC_IP, "***.***.***.***");
    SetDlgItemText(hDlg,IDC_PORT, "20000");
        SetDlgItemText(hDlg,IDC_KAZU, "");
        SetDlgItemText(hDlg,IDC_LOOP, "1");
        str[0] = '\0';
        return TRUE;

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDSOSIN:
            GetDlgItemText(hDlg,IDC_IP, str, 255);
            GetDlgItemText(hDlg,IDC_PORT, str, 255);
            GetDlgItemText(hDlg,IDC_KAZU, str, 255);
            GetDlgItemText(hDlg,IDC_LOOP, str, 255);

  //Winsock初期化
  nError = WSAStartup( wversion, &wsadata);
  if( nError) {
    MessageBox(NULL, "初期化エラー", "エラー", MB_OK);
    return -1;
  }

  //Winsockのバージョン確認
  if( wversion != wsadata.wVersion){
    MessageBox(NULL, "バージョンエラー", "エラー", MB_OK);
    return -1;
  }

  //ソケット作成
  c_socket = socket( AF_INET, SOCK_STREAM, 0);
  if(c_socket < 0){
    MessageBox(NULL, "ソケット作成失敗", "エラー", MB_OK);
    return -1;
  }

  //各種設定
  memset( &client, '\0', sizeof( client));
  client.sin_family = AF_INET;
  client.sin_addr.s_addr = inet_addr(hDlg);
  client.sin_port = htons(hDlg);

  //接続
  if( connect(c_socket, (struct sockaddr *)&client, sizeof(client)) < 0) {
    MessageBox(NULL, "接続エラー", "接続エラー", MB_OK);
    return -1;
  }

  if( send(c_socket,hDlg, strlen(a), 0) < 0){
    MessageBox(NULL, "送信エラー", "エラー", MB_OK);
    return -1;
  }

    MessageBox(NULL, "送信完了", "送信", MB_OK);

  //データを受信
  nError = recv(c_socket, data, sizeof(data), 0);
  if( nError <= 0) {
    MessageBox(NULL, "受信エラー", "エラー", MB_OK);
    return -1;
  }

  data[nError] = '\0';
  MessageBox(NULL, data, "受信", MB_OK);

  //ソケットを閉じる
  closesocket( c_socket);

  //Winsock後処理
  WSACleanup();

  return TRUE;

//            MessageBox(hDlg, str, "取得されたメッセージ", MB_OK);
        case IDEND:
            EndDialog(hDlg,wParam);
            return TRUE;
        }
        break;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow){

DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);

  return 0;
}


ロキ  2006-06-16 20:17:11  No: 62159

↑名前間違えました…
知り合いのPCだったので知り合いのをそのまま使ってしまいました…


KING・王  2006-06-16 21:25:57  No: 62160

> error C2664: 'inet_addr' : 1 番目の引数を 'struct HWND__ *' から 'const char *' に変換できません。
> と言うようなエラーが出て進まないのですがこのエラーを回避するのはどうしたらいいか教えてください…

メッセージのとおりです。
inet_addr()の使い方(引数の指定)が間違っています。
inet_addr()に関しては、下記のMSDNのページを読んで確認してください。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp


KING・王  2006-06-16 21:37:35  No: 62161

ついでなので、もう少し。

> client.sin_addr.s_addr = inet_addr(hDlg);
> client.sin_port = htons(hDlg);

???
hDlgって、恐らくダイアログウィンドウのハンドルなのに、なぜそれらを、
inet_addr()やhtons()に渡しているの????
hDlgのことをなんだと思っているのでしょうか?

さらに発見!
> if( send(c_socket,hDlg, strlen(a), 0) < 0){

え〜と、大丈夫ですか?
>      case IDSOSIN:
>            GetDlgItemText(hDlg,IDC_IP, str, 255);
>            GetDlgItemText(hDlg,IDC_PORT, str, 255);
>            GetDlgItemText(hDlg,IDC_KAZU, str, 255);
>            GetDlgItemText(hDlg,IDC_LOOP, str, 255);

GetDlgItemText()を用いて、各テキストボックスに入力されている値(文字列)を
取得しようとしているようですが、
それぞれ上書きされていきますの問題ないのですか?

> ロキ 2006/06/12(月) 13:19:42 <222.151.216.2>
> DOS画面上でなら通信できる物は作りましたがコンソールは・・
え〜と、DOS画面で通信ができるものから、どうしたら、
このようなソースになるのか、少し理解しかねる部分があります。

DOSで通信する部分を、データサイズ等を引数で渡して実行する形の関数にできますか?
それができれば、ダイアログから入力された値をGetDlgItemText()等で取得し、
適宜型変換等を行い、先の関数に引数で渡せば、まず実行はできると思うのですが。


ロキ  2006-06-16 22:07:04  No: 62162

client.sin_addr.s_addr = inet_addr(hDlg);の辺りはこんな感じでやりたいと言う意味で書いた奴です説明なしですいません…
>            GetDlgItemText(hDlg,IDC_IP, str, 255);
>            GetDlgItemText(hDlg,IDC_PORT, str, 255);
>            GetDlgItemText(hDlg,IDC_KAZU, str, 255);
>            GetDlgItemText(hDlg,IDC_LOOP, str, 255);
たしかに上書きしてますね・・よく分からない所多いですがこの辺りは自分でどうにかします…

> DOSで通信する部分を、データサイズ等を引数で渡して実行する形の関数にできますか?
やった事無いと思うのでできないと思います…
できたらどんな感じか教えていただけると…


KING・王  2006-06-17 02:38:37  No: 62163

> フール 2006/06/16(金) 11:15:29 <222.151.216.2>
> error C2664: 'inet_addr' : 1 番目の引数を 'struct HWND__ *' から 'const char *' に変換できません。
> と言うようなエラーが出て進まないのですがこのエラーを回避するのはどうしたらいいか教えてください…

> ロキ 2006/06/16(金) 13:07:04 <222.151.216.2>
> client.sin_addr.s_addr = inet_addr(hDlg);の辺りはこんな感じでやりたいと言う意味で書いた奴です説明なしですいません…

話が矛盾しませんか?
こんな感じでやりたい、というコードをコンパイルして出たエラーを回避することに、
一体どんな意味があるのですか?

>> DOSで通信する部分を、データサイズ等を引数で渡して実行する形の関数にできますか?
>やった事無いと思うのでできないと思います…
DOSで通信するソフトはできたとの話ですが、その際に通信先等はどのように記載されたのですか?
それは変数を使っていますか?
使っていないのなら、変数を用いる形に変えてください。
それができたら、それらの変数を引数で渡す形にすれば言いだけです。
関数化ができないのなら、main()の引数として渡すことはできますか?


KING・王  2006-06-17 02:58:06  No: 62164

さらに気づいたので。。。

提示されたコードでは、相手から送信がなかった場合に、recv()の部分で、
相手からの送信を待つので、プログラムが固まってしまうような気がしますが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加