Password="888"; c" />
您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 求高人深度解析socket中的recvfrom和sendto

求高人深度解析socket中的recvfrom和sendto

来源:网络整理     时间:2016/7/28 5:48:38     关键词:

关于网友提出的“ 求高人深度解析socket中的recvfrom和sendto”问题疑问,本网通过在网上对“ 求高人深度解析socket中的recvfrom和sendto”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 求高人深度解析socket中的recvfrom和sendto
描述:

小弟今天写程序,遇到一个怎么也想不明白的问题,如下:
程序是用VC6.0的MFC写的
在一个发送方的程序中有如下语句
typedef Node{
CString ID;
CString Password;
Node *next;
}Node;
Node *test=new Node;
test->ID="sky";
test->Password="888";
char Buffer[1024];
memcpy(Buffer,test,sizeof(Node));
int len=sendto(ServerSocket,Buffer,sizeof(Node),0,(SOCKADDR*)&ClientAddr,sizeof(ClientAddr));
....
在接收方程序:
typedef Node{
CString ID;
CString Password;
Node *next;
}Node;
Node *test=new Node;
char Buffer[1024];
int len=recvfrom(ClientSocket,Buffer,1024,0,(SOCKADDR*)&ServerAddr,&ServerAddrSize);
memcpy(test,Buffer,sizeof(Node));
MessageBox(test->ID);
.....
但是输出结果并不是料想中的“sky”,而是一堆乱码;
一开始是怀疑问题出在memcpy函数上,
于是乎在控制台程序中写了如下代码:
typedef struct InfoListNode{
CString Name;
CString ID;
CString Password;
InfoListNode *next;
}InfoListNode;
InfoListNode *f=new InfoListNode;
f->Name="sky";
f->ID="389901209";
printf("%s\n",f->ID);
printf("%s\n",f->Name);
InfoListNode *ff=new InfoListNode;
char Buffer[1024];
memcpy(Buffer,f,sizeof(InfoListNode));
memcpy(ff,Buffer,sizeof(InfoListNode));
printf("%s\n",ff->ID);
printf("%s\n",ff->Name);
输出结果却是一样的- -
也就是说Buffer在sendto 然后recvfrom的过程中改变了!
后来又把代码改成直接发送一个CString字符串:
发送方:
char Buffer[1024]="sky";
len=sendto(ServerSocket,Buffer,strlen(Buffer),0,(SOCKADDR*)&ClientAddr,sizeof(ClientAddr));
接收方:
char Buffer[1024];
len=recvfrom(ClientSocket,Buffer,1024,0,(SOCKADDR*)&ServerAddr,&ServerAddrSize);
MessageBox(Buffer);
出乎意料的是,输出结果是“sky”,瞬间头大了;为什么用memcpy以后的数据在发送中就会变了,求解释sendto 和recvfrom的机制
跪求牛人解释
PS:socket初始化为 WSAStartup(MAKEWORD(2,2),&wsaData)  socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
以上代码只是片段,一些变量的初始化没给出,但是应该看的懂,但是的但是,如果有什么地方疏漏了或是还请提出来,只求解释啊- -


解决方案1:

楼主对CString理解时候有些问题。
一开始的Node定义来看,有CString作为成员变量。但是CString中的内容并不是在该实例自身地址中。存放内容的buffer是一个堆指针(好像vc6是new出来的,2003以后是malloc出来),这样你接受方,拿到的数据是一个CString的指针,肯定找不到原来的堆空间了。这样反映出来就是乱码。如果你把CString改成固定长度比如char a[128],接收就正常了。至于最后一个测试,本来就应该这样。

解决方案2:

我觉得结构体直接memcpy还是蛮方便的,数据结构一致,长度设置好,直接拷贝还是很方便的


以上介绍了“ 求高人深度解析socket中的recvfrom和sendto”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2980571.html

相关图片

相关文章