【socket⽹络编程】13.把udp数据写⼊发送缓冲区sendto()代码实例
向发送缓冲区写⼊udp数据,下⾯这例⼦是说明,⼀个udp数据包加上ip信息在⽹络层进⾏封装时,可能需要多次写⼊才能完成写进发送缓冲区,使⽤⼀个while循环来实现。
@zhz: 写⼊发送缓冲区的数据是ip数据包,并没有封装mac地址,所以在将发送缓冲区中的数据发送出去后,加上mac地址封装为以太⽹数据包时,如果数据包太⼤,还得分成多帧进⾏发送。
size_t UdpStream::write(const uint8_t* data, size_t length, uint8_t flag){
size_t total_nsent =0;
怎样写代码 自己做编程// if (flag) {
// peer_sockaddr_.sin_addr.s_addr = htonl(INADDR_BROADCAST);
// }
peer_sockaddr_.sin_addr.s_addr = peer_addr_;
peer_sockaddr_.sin_port = peer_broad_port_;
SDEBUG <<"sendto addr: "<<inet_ntoa(peer_sockaddr_.sin_addr)
<<", port: "<<ntohs(peer_sockaddr_.sin_port);
while(length >0){
// 把udp数据写⼊发送缓冲区
ssize_t nsent =
::sendto(sockfd_, data, length,0,(struct sockaddr*)&peer_sockaddr_,
(socklen_t)sizeof(peer_sockaddr_));
if(nsent <0){// error
if(errno == EINTR){
continue;
}else{
/
/ error
if(errno == EPIPE || errno == ECONNRESET){
status_ = Stream::Status::DISCONNECTED;
errno_ = errno;
}else if(errno != EAGAIN){
status_ = Stream::Status::ERROR;
errno_ = errno;
}
return total_nsent;
}
}
total_nsent += nsent;
length -= nsent;
data += nsent;
}
return total_nsent;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论