关于套接字的一点学习

这几天写程序的中心点是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 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值