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

recvla = recvfrom(sock,recvBuf,300,0,(SOCKADDR*)&addrFrom,&len);
if (SOCKET_ERROR == recvla)
{

AfxMessageBox("接收数据败!");
break;
} 为何我的总是接收数据失败呢,就是为何recvla=SOCKET_ERROR ,求指出接受失败的原因, 用的UDP协议,其它加载套接字,绑定端口之类的正常

潇湘沐
浏览 278回答 2
2回答

萧十郎

既然把分给了我就应该帮你解决的,这是一个简单的聊天室,测试后可以。你看下源代码好了。服务器端程序:1,创建套接字(socket)。2,将套接字绑定到本地地址和端口上(bind)。3,等待接受数据(recvfrom)。4,关闭套接字。#include <iostream.h>#include <stdio.h>#include <Winsock2.h> //必须加载套接字的头文件,还必须在工程的链接处添加 Ws2_32.libint 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();}

慕容3067478

视SOCKET是否阻塞而定,如果是阻塞的则会卡住,如果非阻塞则会立即返回。
打开App,查看更多内容
随时随地看视频慕课网APP