首页 > 编程知识 正文

mfc中recv函数,socket通信recv未返回

时间:2023-05-04 09:13:41 阅读:167389 作者:4012

最近很闲,研究一下套接字编程,试着写邮箱服务器。 但是,套接字连接成功后,使用recv ()函数时出现了问题。 ——recv收到的字符串乱码如下。

(LiHua ) ST )是%、%、%、%、%、%、%、%、%、%、%、%还是%?

调试了很久,一直徘徊在奔破的边缘,最后才发现原来是小错误造成的。 果然,疏忽是恶魔。 介绍一下艰难的心路历程吧。 想直接看解决方法的伙伴,也可以跳过代码和图案向后看。 (我不出于私心推荐) ) )。

1 .服务器端收发部分代码,通过客户端输入获取登录名和登录密码。

char User_Name[40]; char Passward[40]; char SendInf_1[40]; //' logupausername 3360 ' cinsendinf _ 1; send(socket_accept,sendinf _ 1,40,0 ); recv(socket_accept,User_Name,40,0 ); char SendInf_2[40]; //' input your password : ' cinsendinf _ 2; send(socket_accept,sendinf _ 2,40,0 ); recv(socket_accept,Passward,40,0 ); 2 .客户端收发部分代码,为了简化篇幅稍加删减。

char recv_buf[100]; char send_buf[100]; for(intI=0; i 2; I ) recv(s_server,recv_buf,100,0 ); cin send_buf; send(s_server,send_buf,100,0 ); }3.在服务器端输入InputYourName和InputPassword。

4 .客户端输入LiHua和123456789

5 .结果如上所述,来自recv的字符串变量User_Name='LiHua '," Password "变为乱码。

出错原因我众里寻他千百度,慕然回首,最终却发现是我的客户端与服务端传送的字符串不匹配。客户端发送的字符串send_buf长度为100字节;而服务端用于接收的字符串User_Name长度却为40字节,完全不够存放发送过来的数据。

微软官方网站的winsock.h头文件文档中对recv函数的说明如下。

ifthedatagramormessageislargerthanthebufferspecified、thebufferisfilledwiththefirstpartofthedatagram、andrecvgeneratestestheresperid for reliable protocols,thedataisretainedbytheserviceprovideruntilitissuccessfullyreadbycallingrecvwithalargeenoughbuffer。

如果数据报或消息大于指定的缓冲区,则缓冲区将填满数据报的第一部分,recv将生成错误WSAEMSGSIZE。 对于UDP等不可信协议,多余的数据会丢失; 对于受信任协议,数据由服务提供商保留,直到通过调用具有足够大缓冲区的recv成功读取。

转移门——recvfunction(Winsock.h ) )。

我在这里建立的TCP连接是可靠的协议。也就是说recv的数据超过缓冲区大小buf时,超出的部分会保留,直到被下一个recv函数提取出来的另一端对应的send函数不起作用了,所以在我的代码的第二次接收中,出现了字符串变量的乱码,而不是我想要的123456789字符串值。

因此,我只要使发送和接收的字符串的长度相同就可以了! (将上述客户端代码的所有100更改为40即可)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。