Это мой первый вопрос, и в первый раз я не смог найти ответ, просто просматривая этот сайт. поэтому, пожалуйста, успокойся, если я сделаю это неправильно. Использование 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);
}
Что должна делать эта строка кода: _'_recvSocket = (AF_INET, SOCK_DGRAM, 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) ссылка на функцию может быть хорошим началом. –
Да, это то, где MSDN велел мне заглянуть в setsockopt, но я понятия не имею, почему и что я должен делать с этим. существует около 50 различных вариантов сокетов. Я не могу найти хорошую ссылку о том, как использовать ее даже в MSDN (как в примере). Действительно ли setockopt является единственным способом достижения модели, связанной с данными? – Mac