關於套接字的一點學習

這幾天寫程序的中心點是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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章