设置套接字属性和获取套接字属性,举例子设置套接字端口可重用

设置套接字属性

  • 头文件
#include <sys/types.h>
#include <sys/socket.h>
  • 定 义 函 数
int setsockopt(int s, int level, int optname, const void * optval,
socklen_t optlen);
  • 函数说明 (节选)
    setsockopt()用来设置参数 s 所指定的 socket 状态. 参数 level 代表欲设置的网络层, 一般设成SOL_SOCKET 以存取 socket 层. 参数 optname 代表欲设置的选项, 有下列几种数值:
optnameValue
SO_DEBUG打开或关闭排错模式
SO_REUSEADDR允许在 bind ()过程中本地地址可重复使用
SO_TYPE返回 socket 形态.
SO_ERROR返回 socket 已发生的错误原因
SO_DONTROUTE送出的数据包不要利用路由设备来传输.
SO_BROADCAST使用广播方式传送
SO_SNDBUF设置送出的暂存区大小
SO_RCVBUF设置接收的暂存区大小
SO_KEEPALIVE定期确定连线是否已终止.
SO_OOBINLINE当接收到 OOB 数据时会马上送至标准输入设备
SO_LINGER确保数据安全且可靠的传送出去.
SO_RCVTIMEO接收超时
SO_SNDTIMEO发送超时
  • 参数 optval 代表欲设置的值,1为真0为假,除了设置暂存区大小外 参数 optlen 则为 optval 的长度.
  • 返回值 成功则返回 0, 若有错误则返回-1, 错误原因存于 errno.
  • 附加说明 EBADF 参数 s 并非合法的 socket 处理代码
ENOTSOCK 参数 s 为一文件描述词, 非 socket
ENOPROTOOPT 参数 optname 指定的选项不正确.
EFAULT 参数 optval 指针指向无法存取的内存空间.

获取套接字属性

  • 头文件
    #include <sys/types.h>
    #include <sys/socket.h>
  • 定义函数
 int getsockopt(int s, int level, int optname, void* optval, socklen_t* optlen);
  • 函数说明
    getsockopt()会将参数 s 所指定的 socket 状态返回. 参数 optname 代表欲取得何种选项状态, 而参数 optval 则指向欲保存结果的内存地址, 参数 optlen 则为该空间的大小. 参数 level、optname 请参考setsockopt().
  • 返回值 成功则返回 0, 若有错误则返回-1, 错误原因存于 errno
  • 错误代码 EBADF 参数 s 并非合法的 socket 处理代码
    ENOTSOCK 参数 s 为一文件描述词, 非 socket
    ENOPROTOOPT 参数 optname 指定的选项不正确

举例子设置套接字端口可重用

int optval = 1;
int optlen = sizeof(int);
int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
if(ret == -1)
{
	fprintf(stderr, "setsockopt failed :%s\n", strerror(errno));
	return -1;
}

举例子设置套接字发送广播数据

地址就设为192.168.137.255之类的,凡是在该局域网的主机的指定端口号上都能接收

int optval = 1;
int optlen = sizeof(int);
int ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, optlen);
if(ret == -1)
{
	fprintf(stderr, "setsockopt failed :%s\n", strerror(errno));
	return -1;
}

记录: 当设置成广播属性,再继续单发时,接收方会收到两个相同的udp数据包!
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值