#include "stdafx.h"
#include "windows.h"
#include <winsock2.h>
#include "stdlib.h"
#pragma comment(lib, "ws2_32.lib")
class CDate
{
public:
BYTE year;
BYTE month;
BYTE day;
BYTE hour;
BYTE minute;
BYTE yday; //day of year
WORD wday; //day of week
};struct CAccountInfo
{
int m_ChannelNum; //该用户当前被许可的通道数
CDate m_ChannelDate[32]; //每个ChannelDate记录该用户对应的某个通道的过期时间
char unused[280 - 4 - 32 * sizeof(CDate)]; //填充字段
};int main(int argc, char* argv[])
{
//创建套接字
SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字
if (INVALID_SOCKET == m_Socket)
{
return FALSE;
} DWORD SerIP = 0x7f000001; //127.0.0.1
SHORT SerPort = 5000; //服务器套接字地址
SOCKADDR_IN m_Addr_IN;
m_Addr_IN.sin_family = AF_INET;
m_Addr_IN.sin_addr.S_un.S_addr = htonl(SerIP);
m_Addr_IN.sin_port = htons(SerPort);
int servAddrLen = sizeof(m_Addr_IN); //连接到服务器
int reVal = connect(m_Socket, (SOCKADDR*)&m_Addr_IN, servAddrLen);
if (SOCKET_ERROR == reVal)
{
return FALSE;
} char Buff[16];
memcpy(Buff, "Begin ", 8);
*(DWORD *)(Buff + 8) = 0xFFFFFFFB; //获取帐号信息指令
memcpy(Buff + 12, "End ", 4);
send(m_Socket, Buff, 16, 0); CAccountInfo mAccountInfo;
recv(m_Socket, (char *)&mAccountInfo, sizeof(CAccountInfo), 0); for(int i = 0; i < 32; i++) //打印帐号信息
{
printf("通道 %02d : %02d-%02d-%02d\n",
mAccountInfo.m_ChannelDate[i].yday,
mAccountInfo.m_ChannelDate[i].month,
mAccountInfo.m_ChannelDate[i].year);
} char *tempBuff = (char *)malloc(16 + sizeof(CAccountInfo));
memcpy(tempBuff, "Begin ", 8);
*(DWORD *)(tempBuff + 8) = 0xFFFFFFFC; //设置帐号信息指令
memcpy(tempBuff + 12, &mAccountInfo, sizeof(CAccountInfo));
memcpy(tempBuff + 12 + sizeof(CAccountInfo), "End ", 4);
send(m_Socket, tempBuff, 12 + sizeof(CAccountInfo) + 4, 0);
free(tempBuff); return 0;
}
着急用啊,谁能帮帮我啊,谢谢
很容易转换的 C++ --> C#
memcpy
:
MemoryStream s = new MemoryStream(buf);
BinaryWriter w = new BinaryWriter(s);
w.Write(x); malloc : newSOCKET the same C++char: byte
{
public Byte year;
public Byte month;
public Byte day;
public Byte hour;
public Byte minute;
public Byte yday; //day of year
public ushort wday; //day of week
}
protected internal struct CAccountInfo
{
int m_ChannelNum; //该用户当前被许可的通道数
List<CDate> m_ChannelDate; //每个ChannelDate记录该用户对应的某个通道的过期时间
List<String> unused; //填充字段
}
private const ulong SerIP = 0x7f000001;
private const short SerPort = 5000;
{
public byte year;
public byte month;
public byte day;
public byte hour; public byte minute;
public byte yday;
public long wday;
} struct CAccountInfo
{
public int m_ChannelNum; //该用户当前被许可的通道数
[MarshalAs(UnmanagedType.LPStruct, SizeConst = 32)]
public CDate[] m_ChannelDate; //每个ChannelDate记录该用户对应的某个通道的过期时间
//此处有问题
public char[] unused = new char[280 - 4 - 32 * Marshal.SizeOf(new CDate())]; //填充字段
};int mainA(int argc, char[] argv)
{
//创建套接字
Socket m_Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建套接字
if(m_Socket == null) return 1;
long SerIP = 0x7f000001; //127.0.0.1
Int16 SerPort = 5000;
IPAddress ipaddr = new IPAddress(SerIP);
IPEndPoint IPInfor = new IPEndPoint(ipaddr, SerPort);
m_Socket.Connect(IPInfor);
if(!m_Socket.Connected)
{
return 1;
} byte[] Buff = new byte[16];
Array.Copy(Buff, Encoding.Default.GetBytes("Begin "), 8);
//获取帐号信息指令
Buff[8] = 0xFF;
Buff[9] = 0xFF;
Buff[10] = 0xFF;
Buff[11] = 0xFB;
Array.Copy(Buff, 12, Encoding.Default.GetBytes("End "), 0, 4);
m_Socket.Send(Buff);
CAccountInfo mAccountInfo = new CAccountInfo();
byte[] bResult = new byte[Marshal.SizeOf(mAccountInfo)];
m_Socket.Receive(bResult);
IntPtr PtrResult = new IntPtr();
Marshal.PtrToStructure(PtrResult, mAccountInfo);
Marshal.Copy(bResult, 0, PtrResult, bResult.Length);
for(int i = 0; i < 32; i++) //打印帐号信息
{
Console.Write("通道 %02d : %02d-%02d-%02d\n",
mAccountInfo.m_ChannelDate[i].yday,
mAccountInfo.m_ChannelDate[i].month,
mAccountInfo.m_ChannelDate[i].year);
}
byte[] tempBuff = new byte[16 + Marshal.SizeOf(mAccountInfo)];
Array.Copy(tempBuff, Encoding.Default.GetBytes("Begin "), 8);
//获取帐号信息指令
tempBuff[8] = 0xFF;
tempBuff[9] = 0xFF;
tempBuff[10] = 0xFF;
tempBuff[11] = 0xFC;
IntPtr PtrSource = new IntPtr();
Marshal.StructureToPtr(mAccountInfo, PtrSource, true);
Marshal.Copy(PtrSource, tempBuff, 12, Marshal.SizeOf(mAccountInfo));
Array.Copy(tempBuff, 12 + Marshal.SizeOf(mAccountInfo), Encoding.Default.GetBytes("End "), 0, 4);
m_Socket.Send(tempBuff);
return 0; }