Как исправить ошибку EINVAL при привязке сокета PF_RDS в C? - PullRequest
0 голосов
/ 17 мая 2019

Я пишу простой сервер, который работает с сокетами PF_RDS. Я создаю сокет с,

rds_soc = socket(PF_RDS,SOCK_SEQPACKET,0);

Поскольку я пытаюсь использовать RDS поверх TCP, я установил следующий параметр сокета.

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));

Функция связывания возвращает значение 22. Ошибка EINVAL. В руководстве page bind () говорится, что ошибка EINVAL возникает, когда сокет не является частью семейства AF_UNIX. Но, как вы можете видеть из кода, я хочу, чтобы сокет был частью семейства 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

Я также включил модуль rds_tcp в Linux, используя

modprobe rds_tcp

и подтвердил, что модуль загружен.

...