C/S模式不停的传送浮点数,每次500个,
用socket, bind ,send recv等传送字符型已经可以了,但是send和recv只能传送char *,不能其他类型,
ACsyncsocket(记不清,呵呵,不好意思)的Send和Recv好像可以,具体怎么作?但是ACsyncsoket定义m_socket后,m_socket.Create(), m_socket.Bind()却绑定错误,用GetLastErr()得到错误代码10022什么意思?

解决方案 »

  1.   

    实际上传送的都是char型数据,只是按照格式进行了还原。如果发送和接收两端的操作系统不同:如32位和64位怕是你的数据还原就会有问题了。如果操作系统相同,应该没问题!
      

  2.   

    这个简单呀,写一个struct;
    struct head
    {
      int datatype;//数据类型整型还是浮点
      int datalen;//数据长度整个发送数据包的长度
      int datanum;//数据个数;
    }
    char* buf[4096];
    struct head *h;
    h=(struct head*)buf;//这个是头信息
    char* data;
    data=buf+sizeof(head);//这个是数据起始位置
    剩下的就不需要我写了吧!!
      

  3.   

    错误代码10022和错误类型怎么对应?在哪里查?
    ---------------------
    vc tools -----> Error Lookup
      

  4.   

    10022 An invalid argument was supplied.  WSAEINVAL
      

  5.   

    mk:@MSITStore:E:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001JAN\1033\win32.chm::/hh/psdkref/errlist_9usz.htm
      

  6.   

    int send(
      SOCKET s,              
      const char FAR *buf,  
      int len,               
      int flags              
    );
    你把你的浮点数的指针强制转化成const char*,制定合适的缓冲区长度即可
      

  7.   

    就是把float的类存直接拷贝过去再传送!不过我估计在不通的操作系统通讯有点问题!
      

  8.   

    float fBeSend;
    int nLength = sizeof(fBeSend);//sizeof(float);
    int send(s, (char*)(&fBeSend),  nLength, 0);
      

  9.   

    bluebohe(薄荷) 你也是星星级的人物,怎么讲出来的东西水平也很一般呀。如果仅仅进行强制转换的话,好要各种的通讯规约干什么。为什么还要转成整数发送后进行还原呀!
      

  10.   

    to dodont(浪无风) 
    那样的话,我每组500个怎么确定?每组顺序对我也很重要啊,开始结束等
      

  11.   

    yening0914(大山) :
    首先楼主并没有说明什么具体的通讯约定,从其字面上看,仅仅是Socket传输数据,send函数是不管你的传输数据是不是什么文本或者非文本的,仅仅是传送定长的数据,下面例子是一个网络传输文件的小程序(当然可以是二进制文件)bluebohe.go.nease.net/send.zip
      

  12.   

    struct aaa 
    {
        float m_fMoney;
    };main()
    {
        struct aaa m_FloatData;   
        m_FloatData.m_fMoney = 10.1234;
        ...
       
        Send(SocketHandle, (void *)&m_FloatData, sizeof(struct aaa));
        ...
    }应该看得懂把。
      

  13.   

    如果要 char 就这样
    Send(SocketHandle, (char *)&m_FloatData, sizeof(struct aaa));就这个意思,试试吧
      

  14.   

    Client Server
    --------------------------------------
    S:[1]Float1
    R:[1]
    S:[1]SUC//SUCCESS
    R:[1]SUC
    S:[2]Float2
    R:[2]
    S:[2]RES//Resend
    R:[2]RES
    S:[2]Float2
    R:[2]
    S:[2]SUC
    ......
      

  15.   

    To bluebohe(薄荷) :
    你只考虑传送数据,不考虑数据的还原,那么这些数据的结果还有什么用呢?!!
      

  16.   

    如果不考虑兼容问题这样就行了
    class TNetYCData
    {
    public:
       WORD    YCNum;
       double YCData[_500];
    };
      

  17.   

    pSendYC->YCNum = RTUS[SendRTUNo].SendYCNo + 1;
            for (i=0;i<RTUS[SendRTUNo].YCNum;i++)
                pSendYC->YCData[i] = YCValue[i];
      

  18.   

    没看出复杂在哪。强制转换就行了,如果要考虑还原不同类型的数据,直接在发送的数据最前面加上识别就行了,一个char就行。
      

  19.   

    回复人: yening0914(大山)
    数据还原不是问题,基本上不用考虑,强制转化就行了
    收到数据后const char*强制转化成浮点数的指针
      

  20.   

    To cpunion(全心全意(有讨论请发短消息)) :
    比如在16位系统下:int --16bit
    32位系统下:
    int --32bit
    此时由16位系统给32位系统发送数据:
    int a[10];
    在32位系统中进行还原改如何做呀?
    按照简单的指针操作,后果不用我说了吧!。。
      

  21.   

    To bluebohe(薄荷) :
    如果不考虑兼容性问题,这个当然是非常简单了!如果考虑兼容性,怕是就。
      

  22.   

    to  yening0914(大山) :真要考虑这个的话,32位机上还原16位数据类型很简单,麻烦的是在16位机上还原32位的,会被截断的。可以在发出的数据前面加上4个字节,第1字节表示0数据类型,第2字节表示位数,第3字节表示字节顺序,还有一字节可供扩充。比如:int16 a[2]={0xffff,0xeeee},发送时数据就是:'I',16,1,0,0xff,0xff,0xee,0xee,
    还原这类数据并不会有太大的麻烦,就算字节顺序不一样,也就是多一些位操作而已。看楼主的意思应该是兼容的平台,不需要这么麻烦。如果实在没把握,可以把数据转成字符串来传送,比如上面的数据,传送时只需要传:
    I4FFFFEEEE就行了,第一字节F表示是整数,第二字节表示16位,这些都可自定义的。接收到了以后用atoi转换就行。基本上不用考虑字节顺序,不过效率就低多了。