sctp_connectx()在FreeBSD上给出了EINVAL

时间:2017-05-17 15:04:17

标签: c freebsd sctp

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/sctp.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char **argv)
{

    struct sockaddr_in remoteAddr;

    int clientSock = socket(PF_INET,SOCK_SEQPACKET,IPPROTO_SCTP);
    if(clientSock == -1) {
        perror("socket");
        return 1;
    }
    memset(&remoteAddr,0,sizeof remoteAddr);
    remoteAddr.sin_family = AF_INET;
    remoteAddr.sin_len = sizeof remoteAddr;
    remoteAddr.sin_port = htons(5555);
    remoteAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sctp_assoc_t assoc_id = 0;
    if(sctp_connectx(clientSock,(struct sockaddr*)&remoteAddr,1, &assoc_id)!= 0) {
        perror("sctp_connectx");
        return 1;
    }
    printf("Connected! Assoc ID %d\n",(int)assoc_id);

    return 0;   
}

运行时,此代码失败:

$ clang  -Wall sctp_connect.c 
$ ./a.out 
sctp_connectx: Invalid argument
$ uname -rp
11.0-RELEASE-p9 amd64

但我无法弄清楚错误是什么。 sctp_connectx()联机帮助页显示如果提供了无效系列地址或没有地址的地址,它将无法使用EINVAL - 但这似乎不是代码中的情况。

sctp_connectx()有几个部分可以使用EINVAL失败,但truss显示它进入setsockopt()调用,因此它是未通过调用的内核:

socket(PF_INET,SOCK_SEQPACKET,132)       = 3 (0x3)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34374418432 (0x800e00000)
setsockopt(0x3,0x84,0x8007,0x800e16000,0x14)     ERR#22 'Invalid argument'

1 个答案:

答案 0 :(得分:0)

我认为您的查询中有答案。如果我们按照cell.layoutMargins跟踪,那么就像你说的那样func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath) as! YourCellClass cell.accessoryType = .none if selectedIndex == indexPath.row { cell.accessoryType = .checkmark } //if you need a custom position for your accessory view cell.layoutMargins = UIEdgeInsetsMake(0, 0, 0, 100) } 失败了。

因此truss会返回实际错误 EINVAL 。并根据FreeBSD setsockopt()手册:

  

[EINVAL]:在非聆听上安装accept_filter(9)         插座被尝试了。

是错误的描述。所以我认为你应该做下面的事情:

  1. 了解您的套接字选项是否与您的侦听器套接字相符。
  2. 检查功能setsockopt()setsockopt()
  3. 的错误

    我的建议是你不应该使用inet_addr(),有关详细信息,请参阅手册的BUG部分。我建议改为使用htons()