recvfrom的返回值为-1,不知哪里出了错

luohaohahaha 2013-09-05 10:20:52

//这是服务器发送
void UDPSocketServer::Send(DWORD IP, int Port,char str[1000])
{
//绑定本地端口号和IP

SOCKET sockServer = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.104");
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(32550);

int ss = bind(sockServer,(SOCKADDR *)&addrServer,sizeof(SOCKADDR));


//获取客户端信息
/* tempAddr.S_un.S_addr=IP;
strcpy_s(buf,inet_ntoa(tempAddr));
p=(LPCTSTR)buf;*/

SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.1.104");
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(32551);

int Byte = sendto(sockServer,str,strlen(str)+1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

//这是客户端接收
void UDPSocketClient::Receive(DWORD IP, int Port)
{
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrServer;addrServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.104");
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(Port);
int len = sizeof(SOCKADDR);
char recvBuff[256]="";
int Byte = recvfrom(sockClient,recvBuff,256,0,(SOCKADDR *)&addrServer,&len);
}



//这是调用的代码
UDPSocketServer udpS;
udpS.Send(inet_addr("192.168.1.104"),32550, "Server said");
UDPSocketClient udpC;
udpC.Receive(inet_addr("192.168.1.104"),32550);


我在调用sendto函数处和recvfrom函数处添加断点,调试的时候,sendto发送成功,但是recvfrom的返回值为什么一直是-1呢?
...全文
2850 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyihu321 2013-09-10
  • 打赏
  • 举报
回复
调用WSAGetLastError看真实的错误是什么
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
来个人给我解决下,十分感谢!
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
你客户端在recvfrom之前需要调用bind()函数。 如果你先调用的是sendto而不是recvfrom,是可以不必调用bind的。

        SOCKADDR_IN addrClient;
	addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.1.104");
	addrClient.sin_family = AF_INET;
	addrClient.sin_port = htons(32551);
	int ss = bind(sockClient,(SOCKADDR *)&addrClient,sizeof(SOCKADDR));
我在客户端的receive添加了以上代码,调试时程序卡着了,要一直等么,等了一分钟也没反应。就一直卡在 int Byte = recvfrom(sockClient,recvBuff,256,0,(SOCKADDR *)&addrServer,&len);这一句。
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
引用 1 楼 ouyh12345 的回复:
函数调用后,要判断返回值的 如果是-1,调用WSAGetLastError看真实的错误是什么

if( 0 > Byte)
{
char str[100];
itoa(WSAGetLastError(),str,10);
}
我在recvfrom函数下面添加了这个if语句,调试时str的值为10022,网上查了说是无效的参数,再怎么办呢,我不知道哪个是无效的参数。
Eleven 2013-09-05
  • 打赏
  • 举报
回复
你客户端在recvfrom之前需要调用bind()函数。 如果你先调用的是sendto而不是recvfrom,是可以不必调用bind的。
ouyh12345 2013-09-05
  • 打赏
  • 举报
回复
函数调用后,要判断返回值的 如果是-1,调用WSAGetLastError看真实的错误是什么
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
引用 12 楼 yison8088 的回复:
DWORD threadID = 0; HANDLE m_Thread; //某Func中开启线程 { m_Thread = CreateThread(NULL, 0, ThreadFunc, this, 0, &threadID); } static DWORD WINAPI ThreadFunc(PVOID pParameter) { //Process....... } //某Func中关闭线程 { if (mDecodeThread) { WaitForSingleObject(m_Thread , 20); TerminateThread(m_Thread , 0); m_Thread = NULL; } }
我没用过线程函数,我将它放在了UDPSocketClient类里面,编译出错,错误为无法解析的外部命令,你说的这几部分应该分别放在什么位置啊?麻烦参考下我最开头提问(1楼上面)的代码处。
yisonli 2013-09-05
  • 打赏
  • 举报
回复
DWORD threadID = 0; HANDLE m_Thread; //某Func中开启线程 { m_Thread = CreateThread(NULL, 0, ThreadFunc, this, 0, &threadID); } static DWORD WINAPI ThreadFunc(PVOID pParameter) { //Process....... } //某Func中关闭线程 { if (mDecodeThread) { WaitForSingleObject(m_Thread , 20); TerminateThread(m_Thread , 0); m_Thread = NULL; } }
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
引用 10 楼 yison8088 的回复:
不是卡死,是阻塞接收,你开个线程一直接收就好了。你发送跟接收不在一个时间点上,很可能收不到。
怎么开线程啊 没学过 初学 见笑了
yisonli 2013-09-05
  • 打赏
  • 举报
回复
不是卡死,是阻塞接收,你开个线程一直接收就好了。你发送跟接收不在一个时间点上,很可能收不到。
luohaohahaha 2013-09-05
  • 打赏
  • 举报
回复
引用 7 楼 yison8088 的回复:
补充一下,发送端不需要bind,receive端需要bind,而你接收端却没有bind,这样肯定随机分一个端口给你,你发送到32551端口,所以接收端收不到。
在4楼我说了,我添加了bind函数之后,运行到recvfrom函数之后,程序就卡着了,貌似假死了。等5分钟都没反应
yisonli 2013-09-05
  • 打赏
  • 举报
回复
补充一下,发送端不需要bind,receive端需要bind,而你接收端却没有bind,这样肯定随机分一个端口给你,你发送到32551端口,所以接收端收不到。
yisonli 2013-09-05
  • 打赏
  • 举报
回复
两点建议,你可以试一下 1.接收的时候开个线程一直保持接收状态 2.你发送到的端口是32551,绑定的监听端口确实32550,这样应该接收不到吧。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧