1.重设socket缓冲区
系统提供的socket缓冲区大小为8K,你可以将之设置为64K,尤其在传输实时视频时。
[root@8A_3 src]# gcc socka.c
[root@8A_3 src]# ls
a.out aa ba.txt socka.c
[root@8A_3 src]# ./a.out
发送缓冲区原始大小为: 16384 字节
接收缓冲区原始大小为: 87380 字节
发送缓冲区大小为: 20480 字节
接收缓冲区大小为: 20480 字节
[root@8A_3 src]# cat socka.c
#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("建立套接字错误
");
return -1;
}
/*
* 先读取缓冲区设置的情况
* 获得原始发送缓冲区大小
*/
optlen = sizeof(snd_size);
err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
if(err<0){
printf("获取发送缓冲区大小错误
");
}
/*
* 打印原始缓冲区设置情况
*/
/*
* 获得原始接收缓冲区大小
*/
optlen = sizeof(rcv_size);
err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
if(err<0){
printf("获取接收缓冲区大小错误
");
}
printf(" 发送缓冲区原始大小为: %d 字节
",snd_size);
printf(" 接收缓冲区原始大小为: %d 字节
",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("设置发送缓冲区大小错误
");
}
/*
* 设置接收缓冲区大小
*/
rcv_size = 10*1024; /* 接收缓冲区大小为8K */
optlen = sizeof(rcv_size);
err = setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);
if(err<0){
printf("设置接收缓冲区大小错误
");
}
/*
* 检查上述缓冲区设置的情况
* 获得修改后发送缓冲区大小
*/
optlen = sizeof(snd_size);
err = getsockopt(s, SOL_SOCKET, SO_SNDBUF,&snd_size, &optlen);
if(err<0){
printf("获取发送缓冲区大小错误
");
}
/*
* 获得修改后接收缓冲区大小
*/
optlen = sizeof(rcv_size);
err = getsockopt(s, SOL_SOCKET, SO_RCVBUF,(char *)&rcv_size, &optlen);
if(err<0){
printf("获取接收缓冲区大小错误
");
}
/*
* 打印结果
*/
printf(" 发送缓冲区大小为: %d 字节
",snd_size);
printf(" 接收缓冲区大小为: %d 字节
",rcv_size);
close(s);
return 0;
}
[root@8A_3 src]#