getsockopt的使用案例

来源:互联网 发布:男士发型设计软件在线 编辑:程序博客网 时间:2024/06/17 05:16
#include <iostream>
#include <string.h>
#include <vector>
#include <winsock2.h>
using namespace std;


#pragma comment(lib,"ws2_32.lib")




union tagval
{
int nVal;
BOOL bVal;
DWORD   dwVal;
linger  lingerVal;
}val;


static char *sock_str_flag(union tagval* p,int)
{
if(p->bVal!=FALSE)
{
printf("on\n");
}
else
{
printf("off\n");
}
return NULL;
}
static char *sock_str_linger(union tagval* p,int)
{
printf("l_onoff:%d l_linger:%d\n",p->lingerVal.l_onoff,p->lingerVal.l_linger);
return NULL;
}
static char *sock_str_timeval(union tagval*,int)
{
return NULL;
}
static char *sock_str_int(union tagval* p,int)
{
printf("%d\n",p->nVal);
return NULL;
}
struct tagsock_opts
{
const char *opt_str;
int opt_level;
int opt_name;
char * (*opt_val_str)(union tagval*,int);
}sock_opts[]={
{"SO_RCVBUF",SOL_SOCKET,SO_RCVBUF,sock_str_int},
{"SO_BROADCAST",SOL_SOCKET,SO_BROADCAST,sock_str_flag},
{"SO_LINGER",SOL_SOCKET,SO_LINGER,sock_str_linger},

{NULL,0,0,NULL}
};










int main(void)
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);


SOCKET s;
int len;
struct tagsock_opts *ptr;
for(ptr=sock_opts;ptr->opt_str!=NULL;ptr++)
{
switch(ptr->opt_level)
{
case SOL_SOCKET:
s=socket(AF_INET,SOCK_STREAM,0 );
break;
default:
break;
}


if(getsockopt(s,ptr->opt_level,ptr->opt_name,(char*)&val,&len)!=SOCKET_ERROR )
{
printf("%s  ",ptr->opt_str);
ptr->opt_val_str(&val,len);
}
else
{
int err=WSAGetLastError();
printf("error:%d\n",err);
}
}
}
0 0
原创粉丝点击