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

luohaohahaha luohaohahaha 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

//这是服务器发送
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呢?
...全文

相关推荐

非阻塞recvfrom的设置

系统默认recvfrom函数是阻塞的,这里是非阻塞的设置!!!

liuhuahua0328

socket编程:recv/send 和 recv/recvfrom返回值及处理

1、recv 和 recvfrom =0 当返回值为0时,表示对端已经关闭了这个链接,我们应该自己关闭这个链接,即close(sockfd)。另外因为异步操作会用select或epoll做事件触发,所以: 1、如果使用select,应该使用FD_CLR(sockfd,fd_set)将sockfd清除掉,不再监听。 2、如果使用epoll,系统会自己将 ...

老王不让用

recvfrom()和sendto()函数

recvfrom()和sendto()函数

Hearthougan

Linux系统调用-- recv/recvfrom 函数详解

从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。

记得退出系统

设置非阻塞recvfrom

下载代码方式:https://pan.quark.cn/s/06d3b9d1d014 在网络编程的应用场景中,recvfrom函数是一种常用于数据接收的操作,然而其默认配置是采用阻塞机制,即该函数会持续等待数据传输的到来。若期望采用非阻塞性质的recvfrom函数,则必须借助ioctlsocket函数来对套接口的状态进行配置。ioctlsocket函数是由Winsock库所提供的一种功能,主要用途在于调控套接口的工作模式。该函数的官方声明为: int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp); 其中,参数s代表套接口的标识符,参数cmd是针对套接口s执行的操作指令,而argp是指向cmd指令相关参数的引用。 在此情形下,我们关注的是FIONBIO指令,该指令用于启用或禁用套接口s的非阻塞功能。若argp所指向的值不为零,则套接口会被设定为非阻塞状态,反之则被设定为阻塞状态。 在实际应用中,我们可以运用如下代码段来配置非阻塞的recvfrom函数: int iMode = 1; ioctlsocket(socketc, FIONBIO, (u_long FAR*) &iMode); 通过上述操作,即可实现使用非阻塞的recvfrom函数进行数据接收。 关于recvfrom函数的执行结果,我们应留意的是,若该函数返回-1,则意味着发生了异常。在此情形下,应调用WSAGetLastError函数来获取具体的错误码,从而执行相应的错误处理流程。 需要强调的是,一旦通过WSAAsynSelect函数将套接口设置为非阻塞状态,就不再能够使用ioctlsocket函数将其切换回阻塞状态。否则,...

chaoyunsmumudn
评论 14
收藏 已收藏
分享
返回顶部
luohaohahaha
网络编程 18,356 成员 64,161 内容