FAST протокол на MOEX. Подключение к тестовому контуру.

  1. Аватар Андрей К
    Вам нужно еще к группе подключиться.
    Адреса сами заполните.

    uint32_t socket_;
    struct sockaddr_in address;
    struct ip_mreq_source group;

    socket_ = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("");
    address.sin_port = htons();

    group.imr_multiaddr.s_addr = inet_addr("");
    group.imr_sourceaddr.s_addr = inet_addr("");
    group.imr_interface.s_addr = INADDR_ANY;


    int optval = 1;

    if (fcntl(socket_, F_SETFL, O_NONBLOCK) < 0) {
    printf(«Socket_%d\tNONBLOCK error\n», socket_);
    } else {
    printf(«Socket_%d\tNONBLOCK\t\tOK\n», socket_);
    }

    if (setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0 ) {
    printf(«Socket_%d\tSO_REUSEADDR error\n», socket_);
    } else {
    printf(«Socket_%d\tSO_REUSEADDR\t\tOK\n», socket_);
    };

    if (bind(socket_, (struct sockaddr *) &address, sizeof(address)) < 0) {
    printf («Socket_%d\tBind error\n», socket_);
    } else {
    printf («Socket_%d\tBinded\t\t\tOK\n», socket_);
    };

    printf («Socket_%d add (%s | %s:%d) to multicast group\n», socket_, «», «», );
    if (setsockopt(socket_, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *)&group, sizeof(struct ip_mreq_source)) < 0 ) {
    printf(«Socket_%d\tadding multicast group error\n», socket_);
    } else {
    printf(«Socket_%d\tadded multicast group\tOK\n», socket_);
    };

FAST протокол на MOEX. Подключение к тестовому контуру.

Добрый день. В настоящий момент пытаюсь реализовать работу с FAST протоколом. MOEX открыл доступ для моего ip  к тестовому контуру. Как и требуется я подключился по заданному ip через VPN соединение. Подключение работает, байты приходят. Далее я пытаюсь читать UDP пакеты уже  своим приложением. Все по стандарту, создал сокет (UDP), подключился, и пытаюсь читать входящие сообщения функцией recvfrom. Однако, ничего на порт не приходит. Порты пробовал разные (1723, 8080, 16105 и т.п.). В сетевом программировании я варюсь не больше месяца, поэтому прошу помочь людей, которые уже проходили подобное. Код прикладываю.

Установка соединения (тут вроде все ок, работает)

bool SClient::Connect(){
    // Init WinSock
    WSAData data;
    WSAStartup( MAKEWORD(2, 2), &data);

	memset(&c_sock, 0, sizeof(c_sock));
	memset(&c_addr, 0, sizeof(c_addr));
	memset(&sender, 0, sizeof(c_addr));
	
	senderAddrSize = sizeof(sender);
	
	//create socket	
    c_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    c_addr.sin_family = AF_INET;
	c_addr.sin_port = htons(port_);   
    c_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	//c_addr.sin_addr.s_addr = inet_addr(ip_);  


	if (bind(c_sock, (sockaddr *) &c_addr, sizeof(c_addr))) {
  		printf("Error bind %d\n", WSAGetLastError());
  		close(c_sock);
		WSACleanup();
  		return false;
	 }
        
    
    return true;
}

Попытка чтения сообщений приходящих на сокет (тут все зависает на функции recvfrom)

    while(true) {
        int res=recvfrom(client.c_sock, (char*)buf, sizeof(buf), 0, (SOCKADDR *)& client.sender, &client.senderAddrSize);
  		printf("Error recvfrom %d\n", WSAGetLastError());
        seq = *(UINT32*)buf;
        printf("%12s:seq=%6d:len=%4d\n", inet_ntoa(client.sender.sin_addr), seq, res);
    }
	

 

 

Чтобы купить акции, выберите надежного брокера: