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);
在通过设置断点,发现不行呀!
各位高手如何解决呀?
结构体声明如下:
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);
在通过设置断点,发现不行呀!
各位高手如何解决呀?
file1.len=0;
```进行初始化。
调用sendn(sock,(char*)file,sizeof(fileinfo));
//在这里,还能清楚地通过断点看到file结构体中len的值为0
sendn()是一个自定义的程序
sendn(sock,char* bp,len)
{
//一进sendn()后就发现bp里面的内容全是乱的了。}
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;
}
int r0=readn(sConnect1,m_buf1,sizeof(fileinfo));//*******程序运行至此报错。
你的那种方式我也试过,即指针只指向m_buf1,而不是第一个元素。还是不行。
这个问题我太郁闷好久了。
多线程还没有做,目前还处于前期,就遇到这个问题。
http://blog.csdn.net/wallacechao/archive/2006/09/26/1289419.aspx
memset(file.1.name,0,100);
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");
//强制的数据类型转换,把传来的信息转为定义的文件信息
我这个是强行转换m_buf为结构体格式!
另外,楼上改的:int r0=readn(sConnect1,&fiinfo,sizeof(fileinfo));
中&fiinfo参数应该为char*指针呀!结构体指针可能不行吧。
必须牵扯到一个强行转换的问题。
我把线程的代码以单线程的方式执行时,没有问题。
问题就出现在下面两句上:
HANDLE hThread;
hThread=CreateThread(NULL,0,clientthread,(LPVOID)NewConnection,0,NULL); DWORD WINAPI clientthread(LPVOID lpparam)
{
SOCKET sConnect1=(SOCKET)lpparam;但按照createthread的用法,这没有错呀?