设置套接字属性
- 头文件
#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 代表欲设置的选项, 有下列几种数值:
optname | Value |
---|---|
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数据包!