关于套接字的一点学习

这几天写程序的中心点是socket,因为手上的一个项目在这一块出了些问题。问题在于我写的程序向伙伴写的程序发送数据,他的程序未能正确接收到我发送的数据。原以为套接字编程就是简简单单地几个socket库函数的使用而已,但现实的问题却总在提醒我,“哥们,你还太天真了!”。痛定思痛,有了以下几点新的认识。

1.流数据的读写,不是一次完成的(如果数据比较大),而是可能分成好几读到的。这个就像是网络中发送数据包一样,如果数据包太大,在发送之前会先对其分片,然后一片一片第发送出去。

2.套接字缓冲区大小可根据需要自行设定。套接字发送数据的过程中,数据是先从数据buffer复制到套接字的发送缓冲区,然后再把发送缓冲区的数据发送出去;而接收数据的过程,则是将收到的数据放到套接字的接收缓冲区中,然后读取到用户程序的缓冲区中。因而,如果数据量比较大的情况,需要自行将套接字缓冲区设的大一点。以下写了几个操作套接字缓冲区大小的函数。

/* 获取发送缓冲区大小 */
int getSndBufSize(int sock)
{
    int snd_size = 0;
    socklen_t optlen = 0;
    int err = -1;

    optlen = sizeof(snd_size);
    err = getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_size, &optlen);
    if (err < 0) {
        printf("get socket buffer size error\n");
        return -1;
    }
    return snd_size;
}
/* 获取接收缓冲区大小 */
int getRcvBufSize(int sock)
{
    int rcv_size = 0;
    socklen_t optlen = 0;
    int err = -1;

    optlen = sizeof(rcv_size);
    err = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
    if (err < 0) {
        printf("get socket buffer size error\n");
        return -1;
    }
    return rcv_size;
}
/* 设置发送缓冲区大小 */
void setSndBufSize(int sock, int set_size)
{
    int snd_size = 0;
    socklen_t optlen = 0;
    int err = -1;

    snd_size = set_size;
    optlen = sizeof(snd_size);
    err = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
    if (err < 0) {
        printf("set snd buff size error\n");
        return ;
    }
    printf("set snd buff size success\n");
    printf("snd buff size = %d\n", getSndBufSize(sock));
    return ;
}

/* 设置接收缓冲区大小 */
void setRcvBufSize(int sock, int set_size)
{
    int rcv_size = 0;
    socklen_t optlen = 0;
    int err = -1;

    rcv_size = set_size;
    optlen = sizeof(rcv_size);
    err = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_size, optlen);
    if (err < 0) {
        printf("set rcv buff size error\n");
        return ;
    }
    printf("set rcv buff size success\n");
    printf("rcv buff size = %d\n", getRcvBufSize(sock));
    return ;
}


发布了28 篇原创文章 · 获赞 0 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章