recvla = recvfrom(sock,recvBuf,300,0,(SOCKADDR*)&addrFrom,&len);
if (SOCKET_ERROR == recvla)
{
AfxMessageBox("接收数据败!");
break;
}
为何我的总是接收数据失败呢,就是为何recvla=SOCKET_ERROR ,求指出接受失败的原因,
用的UDP协议,其它加载套接字,绑定端口之类的正常
recvla = recvfrom(sock,recvBuf,300,0,(SOCKADDR*)&addrFrom,&len);
if (SOCKET_ERROR == recvla)
{
AfxMessageBox("接收数据败!");
break;
}
为何我的总是接收数据失败呢,就是为何recvla=SOCKET_ERROR ,求指出接受失败的原因,
用的UDP协议,其它加载套接字,绑定端口之类的正常
既然把分给了我就应该帮你解决的,这是一个简单的聊天室,测试后可以。你看下源代码好了。
服务器端程序: 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(); }