|
皆様、たびたび質問してすいません。
C++ DLL開発者にもいろいろ聞いて struct ConnectParameter の sockaddr_in dst , sockaddr_in my も
指定しなくてはいけないことが分かりました。
下記のようなコードを書いてみましたが、通信がうまくできませんでした。
ConnectParameter構造体の中で入れ子になっているsockaddr_in構造体の中身も dst、my それぞれ
下記のように設定しましたが、どうもうまくいかず。
sin_family の設定は C++ 上では AF_INET になっているので、調べると
2 を入力すれば IPv4設定ということなので下記のようにしたのですが・・・ どこかおかしいところありましたらご教授ください。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net;
namespace WindowsFormsApplication
{
public partial class Form1 : Form
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ConnectParameter
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Addr1;
public int Port1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Addr2;
public int Port2;
public struct sockaddr_in
{
public ushort sin_family, sin_port;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] sin_addr;
}
}
ConnectParameter CP;
ConnectParameter.sockaddr_in my;
ConnectParameter.sockaddr_in dst;
[StructLayout(LayoutKind.Sequential)]
internal struct WSAData
{
public short wVersion;
public short wHighVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
public string szDescription;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
public string szSystemStatus;
public short iMaxSockets;
public short iMaxUdpDg;
public IntPtr lpVendorInfo;
}
[DllImport("wsock32.dll")]
internal static extern int WSAStartup([In] short wVersionRequested, [Out] out WSAData lpWSAData);
[DllImport("ConnectionDLL.dll", CallingConvention = CallingConvention.Cdecl)]
extern static int Connect(ConnectParameter CP);
public int Ans1;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
WSAData dummy;
int a;
a = WSAStartup(0x0101, out dummy);
try
{
CP.Addr1 = "192.168.1.2";
CP.Port1 = 9999;
CP.Addr2 = "192.168.1.1";
CP.Port2 = 9999;
my.sin_family = 2; //AF_INET(IPv4)は2にする?
my.sin_addr = IPAddress.Parse(CP.Addr1).GetAddressBytes();
my.sin_port = 9999;
dst.sin_family = 2; //AF_INET(IPv4)は2にする?
dst.sin_addr = IPAddress.Parse(CP.Addr2).GetAddressBytes();
dst.sin_port = 9999;
Ans1 = Connect(CP);
}
catch (Exception)
{
}
//Open
if (Ans1 == 0)
{
MessageBox.Show("接続できました。");
}
else
{
MessageBox.Show("接続できませんでした。");
}
}
|