2015-04-04 2 views
0

Это мой первый вопрос, и в первый раз я не смог найти ответ, просто просматривая этот сайт. поэтому, пожалуйста, успокойся, если я сделаю это неправильно. Использование Winsock. Мне нужно отправить И получить пакет информации на другой компьютер, на котором запущена одна и та же программа. тип соединения должен быть UDP (без блокировки, я думаю?) и с использованием модели, связанной с данными. Мне нужно отправлять и получать информацию, используя разные темы? Я знаю, что данные отправляются просто отлично, но они вообще не принимаются.sendto и recvfrom в той же программе?

Я могу легко иметь на передачу программы и совершенно другую программу recv, но, похоже, принципы не переносятся на то, что я пытаюсь сделать.

Должен ли я использовать ту же структуру sockaddr_in для recvfrom и sendto? или они могут использовать один и тот же? как насчет slen? не имеет значения, я пробовал и то, и другое. Я пробовал использовать один порт для отправки и один, чтобы получить, я пробовал иметь один порт для обоих. ничего. Я относительно новичок в Winsock, так что извините, если я чувствую себя безнадежным или пропущенным что-то ужасно очевидное. На данный момент мне просто нужна помощь или, по крайней мере, точка в правильном направлении. Меня не волнует, сколько портов я просто хочу увидеть, когда recv printf поступает с нужными данными.

ошибка Winsock является сбоем привязки 10048 и RECV не удалась 10022

я также упомяну я посмотрел в концепции под названием setsockopt предложенного MSDN, но это только в конечном итоге дальнейшее мое замешательство. я что-то упускаю?

вот некоторые соответствующие функции.

void UDPNetwork::initserver() 
{ 
    initRemote(); 
    slen2= sizeof(si_other); 
    if ((_recvSocket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) 
    { 
     printf("failed to create socket: %d", WSAGetLastError()); 
    } 

    _recvSocket = (AF_INET, SOCK_DGRAM, 0); 
    memset((char *)&server, 0, sizeof(server)); 

    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(PORT); 

    if (bind(_recvSocket, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) 
    { 
     printf("Bind failed with error code : %d", 
      WSAGetLastError()); 
    /* system("PAUSE"); 
      exit(EXIT_FAILURE);*/ 

    } 
} 

void UDPNetwork::initclient(){ 

    slen = sizeof(si_other); 
    _sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    if (_sendSocket == SOCKET_ERROR) 
    { 
     printf("failed to create socket... "); 
     exit(EXIT_FAILURE); 
    } 

    memset((char *)&si_other, 0, sizeof(si_other)); 
    si_other.sin_family = AF_INET; 
    si_other.sin_port = htons(PORT); 
    si_other.sin_addr.S_un.S_addr = inet_addr(SERVER); 

} 

void UDPNetwork::send(float x, float y, float z) 
{ 
    sprintf(bufOut,"%f,%f,%f", x, y, z); 
    if (sendto(_sendSocket, bufOut, strlen(bufOut), 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR) 
    { 
     printf("sento() failed with error code : d%", WSAGetLastError()); 
     exit(EXIT_FAILURE); 
    } 
    //printf("Sent: %s\n", bufOut); 

} 

void UDPNetwork::recv(char *msg) 
{ 
    float ax = 0; float ay = 0; float az = 0; 
    memset(msg, '\0', BUFLEN); 
    recv_len = recvfrom(_recvSocket, msg, BUFLEN, 0, (struct sockaddr*) &si_other, &slen); 


    int nError = WSAGetLastError(); 
    if (nError != WSAEWOULDBLOCK&&nError != 0); 
    { 
      printf("Recv failed with error code : %d", 
     WSAGetLastError()); 
     //system("PAUSE"); 
     //exit(EXIT_FAILURE); 
    } 
    recv = buf; 
    sscanf_s(msg, "'%f,%f,%f", &ax,&ay,&az); 
    printf("RECV: %f %f %f\n", ax, ay, az); 

} 
+1

Что должна делать эта строка кода: _'_recvSocket = (AF_INET, SOCK_DGRAM, 0); '_? –

+0

Ошибки ['WSAEADDRINUSE'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx#WSAEADDRINUSE) и [' WSAEINVAL'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx#WSAEINVAL). Читая о них вместе с ['bind'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737550%28v=vs.85%29.aspx) и [' recv'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121%28v=vs.85%29.aspx) ссылка на функцию может быть хорошим началом. –

+0

Да, это то, где MSDN велел мне заглянуть в setsockopt, но я понятия не имею, почему и что я должен делать с этим. существует около 50 различных вариантов сокетов. Я не могу найти хорошую ссылку о том, как использовать ее даже в MSDN (как в примере). Действительно ли setockopt является единственным способом достижения модели, связанной с данными? – Mac

ответ

0

после поиска глубоко в архивах MSDN я нашел эту полезную маленькую страницу https://msdn.microsoft.com/en-us/library/bb530747%28v=vs.85%29.aspx надеюсь, это будет добавить некоторое представление о моей проблеме. Я буду обновлять информацию о погоде, этот ресурс в конечном итоге решает мои проблемы

+0

В этом примере используются сокеты TCP, а не сокеты UDP. –

1

Большинство приемников UDP отправят данные обратно на тот же IP-порт, из которого были отправлены повторно полученные данные. Таким образом, создавая два разных сокета, вы используете две разные пары IP: порт, что, вероятно, не дает вам данных. Вероятно, данные отправляются на другой IP-порт, чем тот, который вы читаете.

Для UDP обычно вам не нужно создавать отдельные сокеты отправки и получения. Вы можете создать один сокет UDP и использовать его для отправки и получения, поэтому отправляющий IP: Порт соответствует принимающему IP: Порт. Единственный раз, когда вам нужно создавать отдельные сокеты, является то, что приемник намеренно отправляет свои данные на другой IP-порт, чем то, что использует передающий сокет.

Смежные вопросы