其原型为:

#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

成功返回0, 失败返回-1

其代码如下:

#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/tcp.h>
#include <sys/time.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>union val
{int i_val;long l_val;char c_val[10];struct linger linger_val;struct timeval timeval_val;
}val;static char *sock_str_flag(union val*, int);
static char *sock_str_int(union val*, int);
static char *sock_str_linger(union val*, int);
static char *sock_str_timeval(union val*, int);struct sock_opts
{char *opt_str;int opt_level;int opt_name;char *(*opt_val_str)(union val*, int);
}sock_opts[] = {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, sock_str_flag,"SO_DEBUG", SOL_SOCKET, SO_DEBUG, sock_str_flag,"SO_DONTROUTE", SOL_SOCKET, SO_DONTROUTE, sock_str_flag,"SO_ERROR", SOL_SOCKET, SO_ERROR, sock_str_int,"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, sock_str_flag,"SO_LINGER", SOL_SOCKET, SO_LINGER, sock_str_linger,"SO_OOBINLINE", SOL_SOCKET, SO_OOBINLINE, sock_str_flag,"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, sock_str_int,"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, sock_str_int,"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, sock_str_int, "SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, sock_str_int,"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, sock_str_timeval,"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, sock_str_timeval,"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, sock_str_flag,#ifdef SO_REUSEPORT"SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, sock_str_flag,#else"SO_REUSEPROT", 0, 0, NULL,#endif"SO_TYPE", SOL_SOCKET, SO_TYPE, sock_str_int,//"SO_USELOOPBACK", SOL_SOCKET, SO_USELOOPBACK, sock_str_flag,"IP_TOS", IPPROTO_IP, IP_TOS, sock_str_int,"IP_TTL", IPPROTO_IP, IP_TTL, sock_str_int,"TCP_MAXSEG", IPPROTO_TCP, TCP_MAXSEG, sock_str_int,"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, sock_str_flag,NULL, 0, 0, NULL};static char strres[128];
static char *sock_str_flag(union val* ptr, int len)
{if (len != sizeof(int)) {snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);} else {snprintf(strres, sizeof(strres), "%s", (ptr->i_val == 0) ?"off": "on");}return strres;
}static char *sock_str_int(union val* ptr, int len)
{if (len != sizeof(int)) {snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);} else {snprintf(strres, sizeof(strres), "%d", ptr->i_val);}   return strres;
}static char *sock_str_linger(union val* ptr, int len)
{if (len != sizeof(struct linger)) {snprintf(strres, sizeof(strres), "size (%d) not sizeof(struct linger)", len);} else {snprintf(strres, sizeof(strres), "l_onoff=%d, l_linger=%d", ptr->linger_val.l_onoff, ptr->linger_val.l_linger);}return strres;
}static char *sock_str_timeval(union val* ptr, int len)
{if (len != sizeof(struct timeval)) {snprintf(strres, sizeof(strres), "size (%d) not sizeof(struct timeval)", len);} else {snprintf(strres, sizeof(strres), "tv_sec=%d, tv_usec=%d", ptr->timeval_val.tv_sec, ptr->timeval_val.tv_usec);}return strres;
}int main(int argc, char **argv)
{int fd, len;struct sock_opts *ptr;fd = socket(AF_INET, SOCK_STREAM, 0);   for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {printf("%s:", ptr->opt_str);if (ptr->opt_val_str == NULL) {printf("undefined\n");} else {len = sizeof(val);if (getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1) {printf("error:%s\n", strerror(errno));return -1;} else {printf("default: %s\n", ptr->opt_val_str(&val, len));}}}return 0;
}   

SO_USELOOPBACK竟然找不到定义

运行后输出截图如下:

套接口的选项:

网络编程学习笔记(getsockopt和setsockopt函数)相关推荐

  1. 网络编程学习笔记(recv和send函数)

    与read和write函数相似,只是多了一个附加的参数,其函数原型为: #include <sys/socket.h> ssize_t recv(int sockfd, void *buf ...

  2. 网络编程学习笔记(getservbyname和getservbyport函数)

    通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...

  3. 网络编程学习笔记(recvmsg和sendmsg函数)

    这两个函数是最通用的I/O函数.实际上,可以用recvmsg代替read.readv.recv和redvfrom.同样,各种输出函数都可以用sendmsg取代 #include<sys/sock ...

  4. 网络编程学习笔记(readv和writev函数)

    这两个函数与read和write相似,但readv和writev可以让我们在一个函数调用中读取多个缓冲区,这些操作被称为分散读和集中写.其函数原型为: #include <sys/uio.h&g ...

  5. 网络编程学习笔记(UDP的connect函数)

    对于已连接的UDP套接口,发生了三个变化: 1.再也不能给输出操作指定目的IP地址和端口,也就是说,不能再调用 sendto,而使用send或者write.写到已连接UDP套接口上的任何东西都自动发送 ...

  6. 网络编程学习笔记(recvfrom和sendto函数)

    其原型为: #include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags ...

  7. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  8. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  9. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

最新文章

  1. 用Command实现校验器
  2. 吴恩达机器学习笔记7-数据绘制
  3. 阿里云服务器如何加强服务器的安全?有哪些安全措施?
  4. java 线程 api_Java核心API之线程(上)
  5. 使用opencv和python实现图像的智能处理_机器学习:使用opencv和python进行智能图像处理...
  6. [转] 做一个让人欣赏的女子
  7. matlab如何获得数组有多少数,请问MATLAB里有得到一个数组中相同数有多少个的函数么?...
  8. javascript的几种继承方式
  9. AtCoder Beginner Contest 258 A~Ex 题解
  10. 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  11. 重返设计模式--命令模式
  12. 水溶性CdTe/CdSe/ZnS量子点 深紫外发光光谱PL620nm-820nm
  13. OpenCV-Python画虚线
  14. Oracle、MySQL、SqlServer、PG数据库merge into语法实现总结
  15. pdfbox2.0.1将pdf转图片
  16. 各航空公司的网址和电话
  17. 网页上的双语切换(java+jsp/html)
  18. DEL命令居然无法删除文件夹!
  19. 日常用语--征求意见
  20. Gromacs分子动力学模拟流程概述

热门文章

  1. Struts2中的拦截器与过滤器学习
  2. Validator(二)自定义
  3. python编程语言的优缺点-程序员千万不要入错行!常见的AI编程语言优缺点比较...
  4. python爬虫招聘-Python爬虫实战之(二)| 寻找你的招聘信息
  5. python3.5安装-linux系统安装python3.5
  6. python基本使用-python基本用法笔记合集
  7. python 画图 内存-用python 10min手写一个简易的实时内存监控系统
  8. python手机版安卓-用Python实现自动化操作Android手机
  9. python横向柱状图-python绘制横向水平柱状条形图Bar
  10. python3.6安装pyqt5-Python3.6安装PyQt5的方法