日期:2014-05-16  浏览次数:20647 次

linux网络编程send发送的问题
struct struCommPacket{
int PackLength;
int command;
int data_length; 
BYTE* command_data;

};

int main(int argc,char * argv[])
{
struct struCommPacket *pStr;
struct struCommPacket Str = {10, 11, 12, "hello"};
        pStr = &Str;
//sockfd = socket(..)......
//....
send(sockfd, (char *)pStr, sizeof(struct struCommPacket), MSG_NOSIGNAL);

如上面,建立socket通信后发送一个结构体过去,但为什么在发送的时候要把一个结构体指针强转成char*类型的指针呢,这样转过后,pStr指向的又是什么内容???这里不是很懂啊,高手在哪里....!!
Linux 网络编程

------解决方案--------------------
你放心,如果函数的参数要求这样,那么就是正确的,至于send会把它变成什么类型,可以忽略,这就是接口。
------解决方案--------------------
数据流。。。
够6个字符了吧
------解决方案--------------------

pStr -> 0x0000000A000000B0000000C0hello0
第一个字符就是'\0',当然%s打印是打印不出来的。
------解决方案--------------------
(char *)pStr:这里用不用char *强制转化都无所谓,send函数发送从pStr指向的地址开始的,大小为sizeof(struct struCommPacket)的连续内存上的数据;

pStr指向的始终是结构体Str = {10, 11, 12, "hello"};的首地址,不管用什么类型来强制转化pStr,它一直指向Str的首地址不变,只是引用方式变了;

打印指针是printf("%p\n", pStr);,%s是打印字符串;
------解决方案--------------------
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
sockfd:指定发送端套接字描述符。
buff:    存放要发送数据的缓冲区
nbytes:  实际要改善的数据的字节数
flags:   一般设置为0

------解决方案--------------------
没有任何关系,你发的什么你接收端必须知道,接收端到时候再把(char*)强转成实际类型就行了。这种模型很常用。