永发信息网

vc++网络编程recvfrom函数问题?

答案:2  悬赏:10  手机版
解决时间 2021-08-12 10:40
  • 提问者网友:轻浮
  • 2021-08-11 16:42

recvla = recvfrom(sock,recvBuf,300,0,(SOCKADDR*)&addrFrom,&len);
  if (SOCKET_ERROR == recvla)
  {
   
             AfxMessageBox("接收数据败!");
   break;
  }

 

为何我的总是接收数据失败呢,就是为何recvla=SOCKET_ERROR  ,求指出接受失败的原因,

 

用的UDP协议,其它加载套接字,绑定端口之类的正常

最佳答案
  • 五星知识达人网友:忘川信使
  • 2021-08-11 17:10
SOCKADDR_IN tempclient;   //定义这个地址通常是用来接受客户端的地址信息。
 int len=sizeof(SOCKADDR);    //地址长度,这个一定要赋初始值,否则接受失败。
 char ch[100];
 recvfrom(sock,ch,100,0,(SOCKADDR*)&tempclient,&len);
全部回答
  • 1楼网友:神鬼未生
  • 2021-08-11 18:10

既然把分给了我就应该帮你解决的,这是一个简单的聊天室,测试后可以。你看下源代码好了。

服务器端程序: 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(); }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯