以前用过MFC的Csocket可以传递数据结构地址,现在用winsock进行网络通信,winsock要求收发的数据缓冲指针类型是const char FAR*,我要发送一个数据结构,只好把它强制转换成char*,可是传递的数据到接收是就乱了套,有没有其他方法?

解决方案 »

  1.   

    struct 
    {
       int a;
       int b;
       int c;
    }struct a a1;
    char BUF[100];
    memcpy(BUF,(void *)&a1,sizeof(struct a));
    send(Buf,....);
      

  2.   

    楼上的好像是用于Csocket的吧
    winsock中
    int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
      

  3.   

    另外我的数据结构很大,一共24624字节,
    typedef struct
    {

    long   systemType;
    long   Start;
    long   Count;
    long   Range;     
    long   Deviation;
    timeval startTime;
    float  pressure;
    float  temperature;
    float  heading;
    float  pitch;
    float  roll;
    float  WORKData[6][1024];
    }WORKDATA;
    WORKDATA resultdata;
    发送端:
    while(1)
    {
       //resultdata赋值
       send(s,(char*)&resultdata,sizeof(WORKDATA),0);
    }
    接收端:
    while(1)
    {
      numrcv=recv(ns, buffer, sizeof(WORKDATA), 0);
    }
    每次接收时numrcv数字不等,怎样重组成WORKDATA结构呢
      

  4.   

    zfive5的方法可行,但最好进行如下设置:
    project->setting->C++>Code generation>struct member alignment = 1 byte
      

  5.   

    有字对齐问题,在vc编译器中,优化后,一个5byte的结构字对齐后sizeof是8、16等,所以你需要设置一下,在两边的字对齐必须一致。重组结构不用你操心,直接memcpy就可以了,我试验是没有问题的
      

  6.   

    怎么设置?我memcpy之后还是不对,因为numrcv不一定等于数据结构长度
      

  7.   

    send的时候是不是应该加上一些判断,如果是大型数据结构,有可能没有完全发送出去,只发送了一部分.利用SEND的返回值加以判断,直到SEND的返回值累加到正确的结构大小为止
    RECV也使用同样的方法
      

  8.   

    如果send没有发送完全,是不是数据就丢失了,如果不是,怎么找回来
      

  9.   

    我觉得应用程序只需要负责把数据都发送到TCP上,然后的由系统来做实际发送操作
    SEND函数返回的是你把多少数据加到TCP系统缓存中了.
    如果你的STRUCT有NSIZE这么大,代码可以这样写:
    int nSend = 0;
    char buf[nSize];
    memcpy(.......);
    while (nSend<nSize)
    {
      int n=send(s,buf[nSend],nSize-nSend,NULL);
      if(n<0)
       {  error;
         break;}
      if(n==0)
      {   ;break;}
      nSend+=n; 
    }
      

  10.   

    finix说得很对,这样做一般是没有问题的(特殊情况我还没有发现)。
      

  11.   

    问题在于你接收数据的时候,并非一次能完,应该循环接收并累加到一个buffer里,接受结束后应该确保累计接受到的字节数等于发送的字节数,也就是你的结构的大小,然后再memcpy就可以了。你一定知道该怎么做了吧。呵呵。。