下面是我客户端的代码,但recvfrom()老是接收失败,大家帮我看看哪写错了
程序已包含 Ws2_32.lib#include <iostream.h>
#include <Winsock2.h>
#include <windows.h>void main()
{
WSADATA wsadata;
int err;
err=WSAStartup(0x0202,&wsadata);
if (err!=0)
return;
if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion)!=2)
{
WSACleanup();
return;
} SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5555);
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); int len=sizeof(SOCKADDR);
char sendbuf[200];
int retval;
char revbuf[200]; while(1)
{
cin>>sendbuf;
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR *)&addrSrv,len); retval=recvfrom(sockclient,revbuf,200,0,(SOCKADDR *)&addrSrv,&len);//这里错了,本来调试的时候会停在这等待数据的,
if (retval==SOCKET_ERROR) //但却直接往下执行了
break;
cout<<revbuf<<endl;
}
closesocket(sockclient);
WSACleanup();
}
程序已包含 Ws2_32.lib#include <iostream.h>
#include <Winsock2.h>
#include <windows.h>void main()
{
WSADATA wsadata;
int err;
err=WSAStartup(0x0202,&wsadata);
if (err!=0)
return;
if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion)!=2)
{
WSACleanup();
return;
} SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5555);
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); int len=sizeof(SOCKADDR);
char sendbuf[200];
int retval;
char revbuf[200]; while(1)
{
cin>>sendbuf;
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR *)&addrSrv,len); retval=recvfrom(sockclient,revbuf,200,0,(SOCKADDR *)&addrSrv,&len);//这里错了,本来调试的时候会停在这等待数据的,
if (retval==SOCKET_ERROR) //但却直接往下执行了
break;
cout<<revbuf<<endl;
}
closesocket(sockclient);
WSACleanup();
}
客户端发给服务端的数据都能接收到
就服务端发来的数据客户端接收不了 郁闷
还是莫名其妙
无非是创建一个socket,绑定一个socket,while recv socket;
你觉得你写的客户端给这个结构有什么不同吗,什么是客户端,什么是服务器端,你清楚吗
#include <winsock2.h>
#include <windows.h>typedef struct
{
SOCKET socket;
}RECVP;DWORD WINAPI FunReceive(LPVOID lp);void main()
{
WSADATA wsadata;
int err;
err=WSAStartup(0x0202,&wsadata);
if (err!=0)
return;
if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion!=2))
{
WSACleanup();
return;
} SOCKET sockser=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrser;
addrser.sin_family=AF_INET;
addrser.sin_port=htons(5555);
addrser.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(sockser,(SOCKADDR *)&addrser,sizeof(SOCKADDR)); char sendbuf[200]; SOCKADDR_IN addrclient;
int len=sizeof(addrclient); RECVP *rep=new RECVP;
rep->socket=sockser; HANDLE hthread;
hthread=CreateThread(NULL,0,FunReceive,(LPVOID)rep,0,NULL);
CloseHandle(hthread); while (1)
{
cin>>sendbuf;
sendto(sockser,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR *)&addrclient,len);
}
closesocket(sockser);
WSACleanup();
}DWORD WINAPI FunReceive(LPVOID lp)
{
SOCKET socket=((RECVP *)lp)->socket;
delete lp; SOCKADDR_IN addrclient;
int len=sizeof(addrclient);
char revbuf[200];
int retval;
while (1)
{
retval=recvfrom(socket,revbuf,200,0,(SOCKADDR *)&addrclient,&len);
if (retval==SOCKET_ERROR)
break;
cout<<revbuf<<endl;
}
return 0;
}
客户端本来也是写成线程用来接受的,为了查错把线程去了。