如何在C中绑定PF_RDS套接字时解决EINVAL错误?

时间:2019-05-17 19:54:09

标签: c sockets linux-kernel network-programming

我正在编写一个与PF_RDS套接字一起使用的简单服务器。我用创建套接字,

rds_soc = socket(PF_RDS,SOCK_SEQPACKET,0);

由于我试图通过TCP使用RDS,因此我设置了以下套接字选项。

getsockopt(rds_soc,SOL_RDS,SO_RDS_TRANSPORT,(void*)RDS_TRANS_TCP,(socklen_t*)sizeof(RDS_TRANS_TCP)));

我正在声明sockadd_in结构,其中包含我希望套接字绑定到的IP地址和端口。

struct sockaddr_in servaddr;
int port=8888;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = PF_RDS;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(port);

现在,我尝试绑定套接字。

bind(rds_soc, (struct sockaddr *)(&servaddr), sizeof(servaddr));

bind函数返回值22。EINVAL错误。 bind()的手册page说,当套接字不是AF_UNIX系列的一部分时,会发生EINVAL错误。但是,正如您在代码中看到的那样,我希望套接字成为PF_RDS系列的一部分。

由于我是网络编程的新手,所以我们将不胜感激。我要提到的是网页和文档的链接,编写代码时从中获得了参考。

  1. https://github.com/torvalds/linux/blob/master/Documentation/networking/rds.txt
  2. https://linux.die.net/man/7/rds
  3. http://events17.linuxfoundation.org/sites/events/files/slides/rds.pdf

我还在Linux中使用启用了rds_tcp模块,

modprobe rds_tcp

并确认模块已加载。

0 个答案:

没有答案