标签 c 下的文章

“”

sendto(),把UDP数据报发给指定地址和端口。
函数原型
int sendto (int s, const void buf, int len, unsigned int flags, const struct sockaddr to, int tolen);
参数说明
s: socket描述符。
buf: UDP数据报缓存地址。
len: UDP数据报长度。
flags: 该参数一般为0。
to: sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报。
tolen: 对方地址长度,一般为:sizeof(struct sockaddr_in)。
函数返回值
对于sendto()函数,成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。

发送udp数据示例

int udp_send(string ip, int port, string data)
{
    int sockfd;
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        printf("socket error\n");
        return -1;
    }
    struct sockaddr_in addrto;
    bzero(&addrto, sizeof(struct sockaddr_in));
    addrto.sin_family = AF_INET;
    addrto.sin_addr.s_addr = htonl(INADDR_ANY);
    addrto.sin_port = htons(9999);
    //设置广播
    int yes = 1;
    setsockopt(m_nsockfd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));    
    if(bind(m_nsockfd, (struct sockaddr *) & (addrto), sizeof(struct sockaddr_in)) == -1)
    {
        printf("udp_listen bind error...\n");
        return -1;
    }  
    int addrlen = sizeof(sockaddr_in);
    struct sockaddr_in addr;
    bzero(&addr, sizeof(struct sockaddr_in));    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(ip.c_str());
    return sendto(m_nsockfd, data.data(), data.length(), 0, (struct sockaddr *)&addr, addrlen);
}