一、
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,否则会导致协议栈满
}