求助: LINUX下 有何方式可以使setsockopt在7层SOCK_STREAM下有效?

weixin_38340866 2019-07-07 10:52:06
目前小弟实现个项目,在sockfd = socket(AF_INET, SOCK_STREAM, 0)后,connect之前调用setsockopt(sockfd, IPPROTO_IP, IP_OPTIONS, (char *)&opthdr, sizeof(opthdr)) < 0)发现 setsockopt 错误提示: Invalid argument。有驱动或者其他方法可以在connect时传入自己设定的ip options参数吗? 以下为测试代码。 发现只有定义code为7或者131或者134时不会报错,但是也不会连接上目标。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/ip.h>

#define SERV_PORT 80
#define SERV_IP "221.14.145.31"

struct ip_option_hdr {
unsigned char code;
unsigned char length;
unsigned char offset;
unsigned addrs[9];
} opthdr;


int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in servaddr;

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_IP);
servaddr.sin_port = htons(SERV_PORT);


if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) {
perror("socket error : ");
exit(1);
}
memset((char *)&opthdr,0 , sizeof(opthdr));
opthdr.code = 7;
opthdr.length = 39;
opthdr.offset = 4;

//设置套接字发送该选项
if (setsockopt(sockfd, IPPROTO_IP, IP_OPTIONS, (char *)&opthdr, sizeof(opthdr)) < 0) {
perror("setsockopt error ");
return 0;
}

if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
perror("connect error ");
exit(1);
}
write(sockfd, "/r/n/r/n", strlen("/r/n/r/n"));
close(sockfd);
}

求解决方案。。。。。如果麻烦可以红包支持。。。。
...全文
150 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38340866 2019-07-09
  • 打赏
  • 举报
回复
人工置顶。。。。 指数补丁

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧