您的位置:首页 > 运维架构

getsockopt的使用案例

2016-08-09 09:18 106 查看
#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);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: