Network programming Setsockopt()返回错误号10042
因此,我开始使用SCTP,并编写了SCTP服务器应用程序的基础知识(我打算对其进行修改,使其成为对等应用程序)。代码不完整,但我编译并运行它来测试套接字选项,第一个setsockopt返回错误10042(不支持协议)。我已经确定这是setsockopt()的第一次调用返回错误。下面是不完整的代码:Network programming Setsockopt()返回错误号10042,network-programming,tunneling,sctp,Network Programming,Tunneling,Sctp,因此,我开始使用SCTP,并编写了SCTP服务器应用程序的基础知识(我打算对其进行修改,使其成为对等应用程序)。代码不完整,但我编译并运行它来测试套接字选项,第一个setsockopt返回错误10042(不支持协议)。我已经确定这是setsockopt()的第一次调用返回错误。下面是不完整的代码: #include "stdafx.h" #include <iostream> #include <iostream> #include <string.h> #i
#include "stdafx.h"
#include <iostream>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <WS2spi.h>
#include <ws2sctp.h>
#include <wsipv6ok.h>
#include <if.h>
#include "ws2isatap.h"
#include "if_tunnel.h"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "sctpsp.lib")
using namespace std;
using namespace System;
static int LISTENQ = 5;
void isatap_enable(void);
int main(int argc, char* argv[]){
WSADATA wsaData;
int iResult;
int optv = 10;
u_long imode = 1;
bool connected = false;
char *optval = (char*)&optv;
int optlen = sizeof(optval);
sockaddr_in6 servAddr;
sctp_sndrcvinfo sr;
sctp_event_subscribe evnts;
sctp_initmsg init;
memset(&sr,0,sizeof(sr));
memset(&evnts,0,sizeof(evnts));
memset(&init,0,sizeof(init));
memset(&servAddr,0,sizeof(servAddr));
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup function failed with error: %d\n", iResult);
return 1;
}
SOCKET servSock = socket(AF_INET6,SOCK_STREAM,IPPROTO_SCTP);
if(servSock==INVALID_SOCKET){
printf("Socket function failed with error: %d\n",GetLastError());
return 1;
}
if(setsockopt(servSock,IPPROTO_IPV6,IPV6_PROTECTION_LEVEL,optval,sizeof(optval))<0){
printf("setsockopt function failed with error: %d\n", GetLastError());
return 1;
}
u_int servPort = 5000;
servAddr.sin6_family = AF_INET6;
servAddr.sin6_addr = in6addr_any;
servAddr.sin6_port = htons(servPort);
if(setsockopt(servSock,IPPROTO_SCTP,SCTP_EVENTS,(const char*)&evnts,sizeof(evnts)) < 0){
printf("setsockopt function failed with error: %d\n", GetLastError());
return 1;
}
ioctlsocket(servSock,FIONBIO, &imode);
if(bind(servSock,(struct sockaddr*)&servAddr,sizeof(servAddr))<0){
printf("Bind function failed with error: %d\n", GetLastError());
return 1;
}
evnts.sctp_data_io_event = 1;
evnts.sctp_association_event = *(u_char*)optval;
for(;;){
if(listen(servSock,LISTENQ) < 0){
printf("Listen function failed with error: %d/n",GetLastError());
return 1;
}else{
printf("Listening on port %d\n",servPort);
}
}
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#ifndef UNICODE
#定义UNICODE
#恩迪夫
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#包括
#包括
#包括
#包括“WS2ISTAP.h”
#包括“if_tunnel.h”
#pragma注释(lib,“ws2_32.lib”)
#pragma注释(lib,“sctpsp.lib”)
使用名称空间std;
使用名称空间系统;
静态int LISTENQ=5;
void isatap_enable(void);
int main(int argc,char*argv[]){
WSADATA WSADATA;
国际结果;
int optv=10;
u_long imode=1;
布尔连接=假;
char*optval=(char*)&optv;
int optlen=sizeof(optval);
sockaddr_in 6 servAddr;
sctp_sndrcvinfo sr;
sctp_事件_订阅EVNT;
sctp_initmsg init;
memset(&sr,0,sizeof(sr));
memset(&evnts,0,sizeof(evnts));
memset(&init,0,sizeof(init));
memset(&servAddr,0,sizeof(servAddr));
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=无错误){
wprintf(L“WSAStartup函数失败,错误:%d\n”,iResult);
返回1;
}
SOCKET servSock=SOCKET(AF_INET6,SOCK流,IPPROTO_SCTP);
if(servSock==无效的_套接字){
printf(“套接字函数失败,错误:%d\n”,GetLastError());
返回1;
}
如果(setsockopt(servSock,IPPROTO_IPV6,IPV6_PROTECTION_LEVEL,optval,sizeof(optval))OK伙计们,我修复了它(现在lol)。我所做的是用IPPROTO_SCTP替换IPPROTO_IPV6,它似乎可以工作。如果它与python包nameko/kombu/amqp相关,那么这里就有报道了
临时解决方案:将版本回滚到2.1.3
,直到修复为止