求助: LINUX下 有何方式可以使setsockopt在7层SOCK_STREAM下有效?
目前小弟实现个项目,在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);
}
求解决方案。。。。。如果麻烦可以红包支持。。。。