epoll中使用recvfrom 获取不到对端的ip和port

一、

epoll 之后的socket recvfrom的时候,需要设置 

        socklen_t socklen = sizeof(struct sockaddr);    //一定要初始化为sizeof,如果为0 则出错
m_data_len = recvfrom(m_fd, m_data, sizeof(m_data), 0, (struct sockaddr*)&m_addr, &socklen);
printf("NetConnector::recv_udp_packet() == m_addr ip = %s,port == %d", 
inet_ntoa(m_addr.sin_addr), ntohs(m_addr.sin_port));

        

        否则获取不到对端的ip和端口

服务器端代码: n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(structaddr*)&addr,&addrlen); 客户端向服务器端发送msg后,服务器端能收到,但是,在服务器端不能获取正确的发送方的IP地址。 解决: n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(structaddr*)&addr,&addrlen); 在调用recvfrom()之前,加上:addrlen = sizeof(struct sockaddr);即可(之前声明 int addrlen; )。

 

二、客户端和服务器如果需要绑定端口的话,都可以使用bind 进行绑定

       客户端的端口也需要绑定,如果是tcp的话,因为tcp先创建连接,此时就需要绑定端口了

       否则会使用随机的端口和服务器进行连接

三、epoll中每次recv数据时,需要while循环,否则缓冲区满后,有可能不触发epoll_wait

       Server端调用recv函数, socket数据没有完全读出,  后导致Server端协议栈满,建议用while(recv>0)将所有数据全部读出。

       例如

        while(1)

       {

                  recv(data,len )

                  push_to_mypacket(data);    //此时即使push 出错,也只能continue,不能return,否则会导致协议栈满

       }

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值