Ниже вы можете увидеть мой код, который реализует довольно простой UDP-отправитель в C++ с помощью Winsock. Дело в том, что независимо от того, сколько раз я запускаю код, сокет (listenSocket) привязывается к другому UDP-порту. Есть ли какая-то конкретная причина для этого? Я ошибаюсь в своем коде?winsock - гнездо UDP-отправителя, не связанное с нужным портом
благодаря
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
WSADATA wsaData;
SOCKADDR_IN myAddress;
SOCKADDR_IN targetAddress;
int myPort = 60888;
const char *myIP = "192.168.0.1";
int remotePort = 2048;
const char *remoteIP = "192.168.0.2";
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET SendSocket = INVALID_SOCKET;
SOCKET acceptSocket;
char cBuffer[1024] = "Test Buffer";
int nBytesSent = 0;
int nBufSize = strlen(cBuffer);
int iResult;
// Initialize Winsock
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR)
{
cerr<<"Socket Initialization: Error with WSAStartup\n";
system("pause");
WSACleanup();
exit(10);
}
ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ListenSocket == INVALID_SOCKET or SendSocket == INVALID_SOCKET)
{
cerr<<"Socket Initialization: Error creating socket"<<endl;
system("pause");
WSACleanup();
exit(11);
}
//bind
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr(myIP);
myAddress.sin_port = htons(myPort);
targetAddress.sin_family = AF_INET;
targetAddress.sin_addr.s_addr = inet_addr(remoteIP);
targetAddress.sin_port = htons(remotePort);
if(bind(ListenSocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR)
{
cerr<<"ServerSocket: Failed to connect\n";
system("pause");
WSACleanup();
exit(14);
}
else
printf("Server: bind() is OK.\n");
nBytesSent = sendto(SendSocket, cBuffer, nBufSize, 0,
(SOCKADDR *) &targetAddress,
sizeof(SOCKADDR_IN));
printf("Everything is ok\n");
system("PAUSE");
closesocket(ListenSocket);
closesocket(SendSocket);
return EXIT_SUCCESS;
}
EDIT: Может быть, я не так ясно. Что я делаю с этим кодом, это отправить некоторые данные на удаленный компьютер. Но требуется, чтобы сегменты UDP, как представляется, были созданы из определенного порта. Как это может быть сделано? Это неправильно, что я здесь делаю? Теперь, когда я думаю об этом, я думаю, что это действительно так. У SendSocket и ListenSocket нет никакого соединения, правильно? Итак, как я могу сделать так, чтобы сегменты UDP появлялись из определенного UDP-порта? Благодаря!
Спасибо за это разъяснение, я был действительно смущен (хотя это так просто). Я не понял, что сокет может быть привязан к локальному ip/port независимо от того, прослушиваем ли мы входящие данные или передаем их из этого сокета. – nickagian