#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;
}
着急用啊,谁能帮帮我啊,谢谢

解决方案 »

  1.   

    这段并不复杂啊。socket的处理所有语言都一样的,楼主仔细看看应该不难。int main(int argc, char* argv[])
    {
        //这就是C#中创建一个新对SOCKET对像    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);    //打开SOCKET的连接
        
        int reVal = connect(m_Socket, (SOCKADDR*)&m_Addr_IN, servAddrLen);
        if (SOCKET_ERROR == reVal)
        {
            return FALSE;
        }
        //c#这进行了包处理
        char    Buff[16];
        memcpy(Buff, "Begin   ", 8);
        *(DWORD *)(Buff + 8) = 0xFFFFFFFB;                //获取帐号信息指令
        memcpy(Buff + 12, "End ", 4);
    //发送数据,和C#一样    
    send(m_Socket, Buff, 16, 0);    CAccountInfo    mAccountInfo;
        C#开始接受
        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);
        }
      c#又进行封包了。
        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;
      

  2.   

    楼上给的http://www.code2code.net/ 这个可以试下
      

  3.   

    闲着没事。帮你翻译了一下。但是CAccountInfo有问题, unused的定义通不过,遗憾了。
    你自己也看看。    class CDate
        {
            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;        }
      

  4.   

    应该是这个:public string unused;
      

  5.   

    这个不行,需要计算 CAccountInfo 实例大小的时候 public string unused 计算出的结果不正确。
    必须是数组性的或指定unused 长度的。但是在MarshalAs中的SizeConst不可以动态设置值。所以不成。
      

  6.   

    protected internal struct CDate
            {
                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;