系統提供的socket緩沖區大小為8K,你可以將之設置為64K,尤其在傳輸實時視頻時。?
socket發送數據時候先把數據發送到socket緩沖區中,之后接受函數再從緩沖區中取數據,如果發送端特別快的時候,緩沖區很快就被填滿(socket默認的是1024×8=8192字節),這時候我們應該根據情況設置緩沖區的大小,可以通過setsockopt函數實現
?#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <assert.h>
?
int main(int argc,char **argv)
{
??? int err = -1;?? ??? ?/* 返回值 */
??? int s = -1;?? ??? ??? ?/* socket描述符 */
??? int snd_size = 0;?? /* 發送緩沖區大小 */
??? int rcv_size = 0;?? ?/* 接收緩沖區大小 */
??? socklen_t optlen;?? ?/* 選項值長度 */
?
??? /*
???? * 建立一個TCP套接字
???? */
??? s = socket(PF_INET,SOCK_STREAM,0);
??? if( s == -1){
?? ??? ?printf("建立套接字錯誤\n");
?? ??? ?return -1;?? ?
??? }
??? ?
??? /*
???? * 先讀取緩沖區設置的情況
???? * 獲得原始發送緩沖區大小
???? */
??? optlen = sizeof(snd_size);
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取發送緩沖區大小錯誤\n");
??? }? ?
??? /*
???? * 打印原始緩沖區設置情況
???? */
?
??? /*
???? * 獲得原始接收緩沖區大小
???? */
??? optlen = sizeof(rcv_size);
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取接收緩沖區大小錯誤\n");
??? }
??? ?
?? printf(" 發送緩沖區原始大小為: %d 字節\n",snd_size);
?? printf(" 接收緩沖區原始大小為: %d 字節\n",rcv_size);
?
??? /*
???? * 設置發送緩沖區大小
???? */
??? snd_size = 10*1024;??? /* 發送緩沖區大小為8K */
??? optlen = sizeof(snd_size);
??? err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
??? if(err<0){
?? ??? ?printf("設置發送緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 設置接收緩沖區大小
???? */
??? rcv_size = 10*1024;??? /* 接收緩沖區大小為8K */
??? optlen = sizeof(rcv_size);
??? err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);
??? if(err<0){
?? ??? ?printf("設置接收緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 檢查上述緩沖區設置的情況
???? * 獲得修改后發送緩沖區大小
???? */
??? optlen = sizeof(snd_size);
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取發送緩沖區大小錯誤\n");
??? }? ?
?
??? /*
???? * 獲得修改后接收緩沖區大小
???? */
??? optlen = sizeof(rcv_size);
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF,(char *)&rcv_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取接收緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 打印結果
???? */
??? printf(" 發送緩沖區大小為: %d 字節\n",snd_size);
??? printf(" 接收緩沖區大小為: %d 字節\n",rcv_size);
?
??? close(s);
??? return 0;
?發送緩沖區大小為: 20480 字節
?接收緩沖區大小為: 20480 字節
從結果 看出ubuntu系統默認的發送緩沖區大小:16384字節,接收緩沖區87380字節
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <assert.h>
?
int main(int argc,char **argv)
{
??? int err = -1;?? ??? ?/* 返回值 */
??? int s = -1;?? ??? ??? ?/* socket描述符 */
??? int snd_size = 0;?? /* 發送緩沖區大小 */
??? int rcv_size = 0;?? ?/* 接收緩沖區大小 */
??? socklen_t optlen;?? ?/* 選項值長度 */
?
??? /*
???? * 建立一個TCP套接字
???? */
??? s = socket(PF_INET,SOCK_STREAM,0);
??? if( s == -1){
?? ??? ?printf("建立套接字錯誤\n");
?? ??? ?return -1;?? ?
??? }
??? ?
??? /*
???? * 先讀取緩沖區設置的情況
???? * 獲得原始發送緩沖區大小
???? */
??? optlen = sizeof(snd_size);
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取發送緩沖區大小錯誤\n");
??? }? ?
??? /*
???? * 打印原始緩沖區設置情況
???? */
?
??? /*
???? * 獲得原始接收緩沖區大小
???? */
??? optlen = sizeof(rcv_size);
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取接收緩沖區大小錯誤\n");
??? }
??? ?
?? printf(" 發送緩沖區原始大小為: %d 字節\n",snd_size);
?? printf(" 接收緩沖區原始大小為: %d 字節\n",rcv_size);
?
??? /*
???? * 設置發送緩沖區大小
???? */
??? snd_size = 10*1024;??? /* 發送緩沖區大小為8K */
??? optlen = sizeof(snd_size);
??? err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &snd_size, optlen);
??? if(err<0){
?? ??? ?printf("設置發送緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 設置接收緩沖區大小
???? */
??? rcv_size = 10*1024;??? /* 接收緩沖區大小為8K */
??? optlen = sizeof(rcv_size);
??? err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);
??? if(err<0){
?? ??? ?printf("設置接收緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 檢查上述緩沖區設置的情況
???? * 獲得修改后發送緩沖區大小
???? */
??? optlen = sizeof(snd_size);
??? err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取發送緩沖區大小錯誤\n");
??? }? ?
?
??? /*
???? * 獲得修改后接收緩沖區大小
???? */
??? optlen = sizeof(rcv_size);
??? err = getsockopt(s, SOL_SOCKET, SO_RCVBUF,(char *)&rcv_size, &optlen);
??? if(err<0){
?? ??? ?printf("獲取接收緩沖區大小錯誤\n");
??? }
?
??? /*
???? * 打印結果
???? */
??? printf(" 發送緩沖區大小為: %d 字節\n",snd_size);
??? printf(" 接收緩沖區大小為: %d 字節\n",rcv_size);
?
??? close(s);
??? return 0;
}
運行后的結果:
發送緩沖區原始大小為: 16384 字節
?接收緩沖區原始大小為: 87380 字節?發送緩沖區大小為: 20480 字節
?接收緩沖區大小為: 20480 字節
從結果 看出ubuntu系統默認的發送緩沖區大小:16384字節,接收緩沖區87380字節
但是有個問題我設置的接收和發送緩沖區大小為:10*1024=10240字節,但是實際用getoptsock得到卻是20480字節加了一倍。改成其他大小也是都是加倍。
這是由linux內核的算法決定的。