/******************************************
程序名称:socketopt.cpp    
程序功能:该程序演示了getsockopt()函数和setsockopt()函数用法

 changshoumeng 
*/


#include 
<winsock2.h>
#include 
<stdio.h>
#include 
<stdlib.h>
#pragma comment(lib,
"ws2_32.lib")
void main()
{
  WSADATA wsaData;
  SOCKET s;
  
int optname;//存放选项的值
  int optlen;//选项的长度

  
if(WSAStartup(MAKEWORD(2,2),&wsaData) !=0)
  
{
    printf(
"Failed to load winsock. \n");
    
return;
  }

  
  s 
= socket(AF_INET,SOCK_STREAM,0);//创建一个套接口
  if(s == INVALID_SOCKET)
  
{
    printf(
"socket() Error \n");
    
return;
  }


  optlen 
= sizeof(optname);
  printf(
"---------------------------\n");
  
//获得套接口类型
  if(getsockopt(s,SOL_SOCKET,SO_TYPE,(char *)&optname,&optlen) ==SOCKET_ERROR)
  
{
      printf(
"getsockopt() Error: %u \n",WSAGetLastError());
      
return;
  }

  printf(
"以下信息是由getsockopt()函数取得的SO_SOCKET 级别选项实例\n");
  
switch(optname)
  
{
    
case SOCK_STREAM: printf("SO_TYPE:SOCK_STREAM \n");break;
    
case SOCK_DGRAM : printf("SO_TYPE:SOCK_DGRAM  \n");break;
    
case SOCK_RAW    : printf("SO_TYPE:SOCK_RAW \n");break;
  }

  
//获取接收缓冲区的大小
   if(getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&optname,&optlen) ==SOCKET_ERROR)
   
{
      printf(
"getsockopt() Error: %u \n",WSAGetLastError());
      
return;
   }

   printf(
"SO_RCVBUF:%d \n",optname);

   
//获取发送缓冲区的大小
   if(getsockopt(s,SOL_SOCKET,SO_SNDBUF,(char *)&optname,&optlen) ==SOCKET_ERROR)
   
{
      printf(
"getsockopt() Error: %u \n",WSAGetLastError());
      
return;
   }

    printf(
"SO_SNDBUF:%d \n",optname);

   optname 
= 16*1024;
    
//重新设置缓冲区的大小
   if(setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&optname,sizeof(optname) )== SOCKET_ERROR)
   
{
     printf(
"setsockopt() Error: %u \n",WSAGetLastError());
     
return;
   }

   
//获取重新设置的接收缓冲区的大小
    if(getsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&optname,&optlen) == SOCKET_ERROR)
    
{
      printf(
"getsockopt() Error: %u \n",WSAGetLastError());
      
return;
    }

    printf(
"---------------------\n");
    printf(
"使用setsockopt()函数设置后再取得的SO_RCVBUF数值\n");
    printf(
"SO_RCVBUF:%d \n",optname);
    printf(
"---------------------\n");
    WSACleanup();

}