我自己设计了一个结构,如下:
typedef struct _trp{
… …
ULONG bufferLength;
PVOID buffer;
… …
}TRP,*PTRP;
我想在主机上通过socket传输一块数据到另一台机器上(客户端),UCHAR* buffer=(UCHAR*)malloc(50);
CString str=_T(“This is a test!”);
ULONG len=strlen(str);
memcpy(buffer,str,len);TRP trp;
trp.bufferLength=len;
trp.buffer=buffer;
然后我用socket发送:
pSocket->send(&trp,100);
在接受端可以接收到,但是传来的字符串怎么也显示不出来,不知道是不是传过来的只是个指针,相应的内容没有传过来。
写得比较罗嗦,希望能看明白!在线等待!
typedef struct _trp{
… …
ULONG bufferLength;
PVOID buffer;
… …
}TRP,*PTRP;
我想在主机上通过socket传输一块数据到另一台机器上(客户端),UCHAR* buffer=(UCHAR*)malloc(50);
CString str=_T(“This is a test!”);
ULONG len=strlen(str);
memcpy(buffer,str,len);TRP trp;
trp.bufferLength=len;
trp.buffer=buffer;
然后我用socket发送:
pSocket->send(&trp,100);
在接受端可以接收到,但是传来的字符串怎么也显示不出来,不知道是不是传过来的只是个指针,相应的内容没有传过来。
写得比较罗嗦,希望能看明白!在线等待!
typedef struct _trp{
… …
ULONG bufferLength;//缓冲区长度
PVOID buffer[0];//缓冲区
}TRP,*PTRP;CString str=_T(“This is a test!”);
int len = sizeof(TRP) + strlen(str) + 1;
PTRP pTrp = (PTPR)malloc( len );//...
pTrp->bufferLength = strlen(str) + 1;
memcpy(pTrp->buffer,str,pTrp->bufferLength);然后用 socket 发送 pTrp 指向的地址的内容, 长度为 len, 如
send(sock, pTrp, len, 0);接收方受到后可以直接使用 buffer 指向的字符串。不过接收方要分配足够的内存!最好是结构中不含有指针,
… …; //其他指示变量,如结构类型标识
ULONG length;//缓冲区长度
}TRP,*PTRP;每次发送,先发送一个上面的结构,然后发送 length 个 字节 长度的数据。这样,如果有多个不定长度的区域,可以使用多个结构。接收方根据结构标
识对随后的数据进行解释。例如 gif 文件的格式就是这样作的。
pTrp->bufferLength = strlen(str) + 1;这里的“+1”是什么意思?如果不是字符串就可以不用“+1”了吧?
每次发送,先发送一个上面的结构,然后发送 length 个 字节 长度的数据。这样,如果有多个不定长度的区域,可以使用多个结构。接收方根据结构标
识对随后的数据进行解释。这样后来发送的数据不会丢失吧?
如果数据量比较大,我担心有些数据包会丢失,请教!
在发送端没有必要做太多的处理,在接收端每次接收的数据量是不一样的,
只要能保证每次接收到的数据是发送端口的结构的大小,在将接收到的数据
转化成相应的结构指针即可。如果有很多个结构传输,可以先传输一个标示
符,在接收端先接收这个标示符,然后再确定结构的长度。
{
offset = 0;
re = recv(m_sock, nType, 1, 0);
if(re == 0)
break;
switch(nType[0])
{
case ADD_USER:
nLen = sizeof(struct CUserInfo);
break;
case USE_LOG:
nLen = sizeof(struct CUserLog);
break;
case MSG_SEND:
nLen = sizeof(struct CUserMsg);
break;
default:
printf("else Len :%d\n", nLen);
continue;
break;
}
pmsg = new char[nLen];
re = recv(m_sock, pmsg, nLen, 0);
if(re > 0)
{
offset += re;
while(nLen != re)
{
nLen -= re;
re = recv(m_sock, pmsg + offset, nLen, 0);
if(re <= 0)
{
printf("read over\n");
delete pmsg;
goto Ex;
//break;
}
offset += re;
}
PeekMsg(nType[0], pmsg);
}
delete pmsg;
}while(re > 0);Ex:
shutdown(m_sock, SD_RECEIVE);
}
glhorse(happy day)兄的代码很有帮助,多谢指点迷津!又及:
所定义的结构中,
PVOID buffer[0];//缓冲区
一句,编译时通不过,提示:zero-sized array in struct/union
非要这样定义吗?为什么要用0作为维数?怎样使编译能通过?这一贴给的分太少,待会儿再开一贴,诸位兄台一定记着去领分!
glhorse(happy day)兄的代码很有帮助,多谢指点迷津!又及:
chzy00(逸少)兄所定义的结构中,
PVOID buffer[0];//缓冲区
一句,编译时通不过,提示:zero-sized array in struct/union
非要这样定义吗?为什么要用0作为维数?怎样使编译能通过?这一贴给的分太少,待会儿再开一贴,诸位兄台一定记着去领分!