RT:
结构体声明如下:
struct fileinfo
{int fileno;
 int type;
 int seek;
 char name[100];
}
fileinfo file1;
现在我对结构体进行初始化后,用send(sock,char* bp,len,0)的方式将结构体发送出去?
我用强制转换,
即send(sock,(char*)&file1,sizeof(fileinfo),0);
在通过设置断点,发现不行呀!
各位高手如何解决呀?

解决方案 »

  1.   

    程序思路如下:
    file1.len=0;
    ```进行初始化。
    调用sendn(sock,(char*)file,sizeof(fileinfo));
    //在这里,还能清楚地通过断点看到file结构体中len的值为0
    sendn()是一个自定义的程序
    sendn(sock,char* bp,len)
    {
    //一进sendn()后就发现bp里面的内容全是乱的了。}
      

  2.   

    试试 send(sock,(char*)&file1[0],sizeof(fileinfo),0);
      

  3.   

    你前后代码不一致,不知道是否还有其他问题;不过函数中指针类型是char*,和原来的结构体不同,因此不能直接看到其内容,可以看看内存中数据是否一致(传指针应该是同一个内存位置),或者强制转换后看内容;
      

  4.   

    相关源码如下:大家帮着诊断一下。
    Client:  struct fileinfo
    {
    int fileno;//文件号
    int type;//消息类别。有三种有效的取值:0/1/2
    long len;//文件长度
    int seek;//开始位置
    char name[100];//文件名
    };
    int main(int argc, char* argv[])
    {

    char* m_buf1;
    m_buf1=new char[100];
    .....(SOCKET初始化,略) connect(NewConnection,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr));
    printf("连接远程服务器成功!\n"); fileinfo fileinfo1;
    printf("初始化文件结构!\n");
    fileinfo1.len=0;
    fileinfo1.seek=0;
    fileinfo1.type=0;
    fileinfo1.fileno=0;
    strcpy(fileinfo1.name,"this is ate"); //发送命令
    int aa=sendn(NewConnection,(char*)&fileinfo1,sizeof(fileinfo));

    if(aa<0)
    {
    closesocket(NewConnection);
    return -1;
    }
    printf("发送第一次连接信息!\n"); //接收服务器传来的信息
    aa=readn(NewConnection,m_buf1,100);//*******程序运行至此报错。
    if(aa<0)
    {
    closesocket(NewConnection);
    return -1;
    }
    printf("接收服务器第一次信息!\n");
    Server主函数中调用clientthread线程
       DWORD WINAPI clientthread(LPVOID lpparam)
    {
    //文件消息
    fileinfo fiinfo;
    SOCKET  sConnect1=(SOCKET)lpparam;
    char* m_buf1;
    m_buf1=new char[sizeof(fileinfo)];
    printf("接收第一次客户信息\n"); int r0=readn(sConnect1,&m_buf1[0],sizeof(fileinfo));//*******程序运行至此报错。
    if(r0<0)
    {
    closesocket(sConnect1);
    return -1;
    }
    printf("接收客户端第一次信息成功\n");
    //强制的数据类型转换,把传来的信息转为定义的文件信息
    fiinfo=*(fileinfo*)m_buf1;
    另外,readn为自定义程序
    int readn(SOCKET fd,char *bp,int len)
    {
    int cnt;//用来记录缓冲区中的剩余可用空间。
    int rc;
    cnt=len;
    while(cnt>0)
    {
    rc=recv(fd,bp,cnt,0);
    if(rc==SOCKET_ERROR)
    {
    CString aa;
    aa="接收错误!\n";
    printf(aa);
    return -1;
    }
    //If the connection has been gracefully closed, the return value is zero.
    if(rc==0) 
    return len-cnt;
    //读取了一些数据之后,缓冲区指针也应该相应地增加。
    bp+=rc;
    //读取了一些数据之后,缓冲区中的剩余可用空间也应该相应地减小。
    cnt-=rc;
    }
    return len;
    }
      

  5.   

    这行改一下
    int r0=readn(sConnect1,m_buf1,sizeof(fileinfo));//*******程序运行至此报错。
      

  6.   

    To:akirya(坏[其实偶不是什么所谓的坏人]) 
    你的那种方式我也试过,即指针只指向m_buf1,而不是第一个元素。还是不行。
      

  7.   

    为了便于大家分析,我把服务端和客户端的源代码全部放在我的blog上,请大家一定要帮忙一下!
    这个问题我太郁闷好久了。
    多线程还没有做,目前还处于前期,就遇到这个问题。
    http://blog.csdn.net/wallacechao/archive/2006/09/26/1289419.aspx
      

  8.   

    在发送结构体之前
    memset(file.1.name,0,100);
      

  9.   

    仔细看了一下代码,你写的不对,
    fiinfo=*(fileinfo*)m_buf1;这个是什么意思呢?
    要拷贝过去也应该是memcpy(&fiinfo,m_buf1,sizeof(fiinfo) );你那样写根本没有将数据赋值给结构体。以下是我改过代码,没有调试==========================主函数中调用clientthread线程
    DWORD WINAPI clientthread(LPVOID lpparam)
    {
    //文件消息
    fileinfo fiinfo;
    SOCKET sConnect1=(SOCKET)lpparam;
    int r0=readn(sConnect1,&fiinfo,sizeof(fileinfo));//*******程序运行至此报错。
    if(r0<0)
    {
    closesocket(sConnect1);
    return -1;
    }
    printf("接收客户端第一次信息成功\n");
    //强制的数据类型转换,把传来的信息转为定义的文件信息
      

  10.   

    同意楼上说的要拷贝过去也应该是memcpy(&fiinfo,m_buf1,sizeof(fiinfo) );你那样写根本没有将数据赋值给结构体。
      

  11.   

    fiinfo=*(fileinfo*)m_buf1;这个是什么意思呢?
    我这个是强行转换m_buf为结构体格式!
    另外,楼上改的:int r0=readn(sConnect1,&fiinfo,sizeof(fileinfo));
    中&fiinfo参数应该为char*指针呀!结构体指针可能不行吧。
    必须牵扯到一个强行转换的问题。
      

  12.   

    经过一天的重新测试,我最终发现问题出在创建线程时的套接字参数传递上。
    我把线程的代码以单线程的方式执行时,没有问题。
    问题就出现在下面两句上:
    HANDLE  hThread;  
            
    hThread=CreateThread(NULL,0,clientthread,(LPVOID)NewConnection,0,NULL); DWORD WINAPI clientthread(LPVOID lpparam)
    {
    SOCKET  sConnect1=(SOCKET)lpparam;但按照createthread的用法,这没有错呀?
      

  13.   

    刚才用又调试了一下,发现没有问题,socket传参前是48f,传后也是48f,看来还是代码的问题呀。但同一份代码,不用多线程什么事都没有,一用多线程,就出问题。郁闷。