Я пишу простой сервер, который работает с сокетами 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.
Поскольку я довольно новичок в сетевом программировании, любая помощь будет высоко оценена. Я упоминаю ссылки на веб-страницы и документацию, на которые я ссылался при написании кода.
- https://github.com/torvalds/linux/blob/master/Documentation/networking/rds.txt
- https://linux.die.net/man/7/rds
- http://events17.linuxfoundation.org/sites/events/files/slides/rds.pdf
Я также включил модуль rds_tcp в Linux, используя
modprobe rds_tcp
и подтвердил, что модуль загружен.