为了账号安全,请及时绑定邮箱和手机立即绑定

您好,求解释关于vc++网络编程recvfrom函数问题?

您好,求解释关于vc++网络编程recvfrom函数问题?

C C++
潇湘沐 2021-11-05 11:07:19
recvla = recvfrom(sock,recvBuf,300,0,(SOCKADDR*)&addrFrom,&len);if (SOCKET_ERROR == recvla){AfxMessageBox("接收数据败!");break;} 为何我的总是接收数据失败呢,就是为何recvla=SOCKET_ERROR ,求指出接受失败的原因, 用的UDP协议,其它加载套接字,绑定端口之类的正常
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

既然把分给了我就应该帮你解决的,这是一个简单的聊天室,测试后可以。你看下源代码好了。服务器端程序:
1,创建套接字(socket)。
2,将套接字绑定到本地地址和端口上(bind)。
3,等待接受数据(recvfrom)。
4,关闭套接字。#include <iostream.h>
#include <stdio.h>
#include <Winsock2.h> //必须加载套接字的头文件,还必须在工程的链接处添加 Ws2_32.lib
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//请求套接字版本
wVersionRequested = MAKEWORD( 1, 1 ); //用MAKEWORD宏请求1.1版本的Winsock库

err = WSAStartup( wVersionRequested, &wsaData ); //加载套字节,确定使用版本
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) //低字节和高字节是不是1
{
WSACleanup( ); //终止对Winsock库的使用
return 0;
}
//创建套接字
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //定义一个sock用来接受返回的套接字

//定义一个地址结构体
SOCKADDR_IN ip;
ip.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //IP,或者用ip.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
ip.sin_family=AF_INET; //指定地址族
ip.sin_port=htons(8888); //端口 //绑定套接字
bind(sock,(SOCKADDR*)&ip,sizeof(SOCKADDR)); char sendbuf[100]; //发送数据
char recvbuf[100]; //接受数据
char temp[200]; //其他用处 SOCKADDR_IN client; //用于接受客户端的地址信息
int len=sizeof(SOCKADDR); //长度
while(true)
{
//接受数据
recvfrom(sock,recvbuf,100,0,(SOCKADDR*)&client,&len);
if(strcmp("out",recvbuf)==0)
{
sendto(sock,"out",sizeof("out")+1,0,(SOCKADDR*)&client,len); //地址在我们调用recvfrom已经得到了
cout<<"客户端程序已经退出,聊天终止\n";
break;
}
sprintf(temp,"IP是%s的人说:%s",inet_ntoa(client.sin_addr),recvbuf);
cout<<temp<<endl;
cin.getline(sendbuf,100);
sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&client,len);
}
closesocket(sock);
WSACleanup();
return 0;
}
----------------
客户端程序:
1,创建套接字(socket)。
2,向服务器发送数据(sendto)。
3,关闭套接字。#include <Winsock2.h> //必须加载套接字的头文件,还必须在工程的链接处添加 Ws2_32.lib
#include <iostream.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//请求套接字版本
wVersionRequested = MAKEWORD( 1, 1 ); //用MAKEWORD宏请求1.1版本的Winsock库

err = WSAStartup( wVersionRequested, &wsaData ); //加载套字节,确定使用版本
if ( err != 0 )
{
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) //低字节和高字节是不是1
{
WSACleanup( ); //终止对Winsock库的使用
return 0;
} //创建套接字
SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);

//发送数据
SOCKADDR_IN fuwuqi;
fuwuqi.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
fuwuqi.sin_family=AF_INET;
fuwuqi.sin_port=htons(8888);
char sendbuf[100];
char recvbuf[100];
char temp[200];
int len=sizeof(SOCKADDR);
while(true)
{
cout<<"请输入你要说的话\n";
cin.getline(sendbuf,100);
sendto(sock,sendbuf,sizeof(sendbuf)+1,0,(SOCKADDR*)&fuwuqi,len);
recvfrom(sock,recvbuf,100,0,(SOCKADDR*)&fuwuqi,&len);
if(strcmp(recvbuf,"out")==0)
{
cout<<"程序退出\n";
break;
}
sprintf(temp,"服务器%s说:%s",inet_ntoa(fuwuqi.sin_addr),recvbuf);
cout<<temp<<endl;
}
closesocket(sock);
WSACleanup();
}



查看完整回答
反对 回复 2021-11-09
?
慕容3067478

TA贡献1773条经验 获得超3个赞

视SOCKET是否阻塞而定,如果是阻塞的则会卡住,如果非阻塞则会立即返回。

查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 333 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信