UDP-сервер с 2 клиентами, как назначить им определенный порт - PullRequest
0 голосов
/ 03 декабря 2018

У меня небольшая проблема, у меня есть сервер и клиентские приложения.

И вот что я хочу, когда я запускаю сервер + клиент, сообщения приходят из порта 15011, потому что я связал его внутрифайл клиента, но я хочу запустить, 2 клиента одновременно, затем я получаю сообщение от порта 15011, и один случайным образом назначается, и я хочу, чтобы сообщение 2-го клиента было получено от 15012.

Должен ли я иметьутверждение IF о том, что он проверяет, свободен ли этот порт, затем принимает его, а просто занял порт + 1, это даже возможно.Любое предложение будет большим подспорьем для меня.

Спасибо вперед!

// UDP client that uses blocking sockets
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include "conio.h"

#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define SERVER_IP_ADDRESS "127.0.0.1"       // IPv4 address of server
#define SERVER_PORT 15000                   // Port number of server that will be used for communication with clients
#define BUFFER_SIZE 512                     // Size of buffer that will be used for sending and receiving messages to client


int main()
{
    // Server address structure
    sockaddr_in serverAddress, clientAdress;

    // Size of server address structure
    int sockAddrLen = sizeof(serverAddress);

    // Buffer that will be used for sending and receiving messages to client
    char dataBuffer[BUFFER_SIZE];

    // WSADATA data structure that is used to receive details of the Windows Sockets implementation
    WSADATA wsaData;

    // Initialize windows sockets for this process
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    // Check if library is succesfully initialized
    if (iResult != 0)
    {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    // Initialize memory for address structure
    memset((char*)&serverAddress, 0, sizeof(serverAddress));

    // Initialize address structure of server
    serverAddress.sin_family = AF_INET;                             // IPv4 address famly
    serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);   // Set server IP address using string
    serverAddress.sin_port = htons(SERVER_PORT);                    // Set server port


    memset((char*)&clientAdress, 0, sizeof(clientAdress));

    // Initialize address structure of server
    clientAdress.sin_family = AF_INET;                              // IPv4 address famly
    clientAdress.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);    // Set server IP address using string
    clientAdress.sin_port = htons(15011);                   // Set server port


    // Create a socket
    SOCKET clientSocket = socket(AF_INET,      // IPv4 address famly
        SOCK_DGRAM,   // Datagram socket
        IPPROTO_UDP); // UDP protocol


    iResult = bind(clientSocket, (SOCKADDR *)&clientAdress, sizeof(clientAdress));


// Check if socket creation succeeded
    if (clientSocket == INVALID_SOCKET)
    {
        printf("Creating socket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    while (1) {
        printf("Enter message to send:\n");

        // Read string from user into outgoing buffer
        gets_s(dataBuffer, BUFFER_SIZE);

        // Send message to server
        iResult = sendto(clientSocket,                      // Own socket
            dataBuffer,                     // Text of message
            strlen(dataBuffer),             // Message size
            0,                                  // No flags
            (SOCKADDR *)&serverAddress,     // Address structure of server (type, IP address and port)
            sizeof(serverAddress));         // Size of sockadr_in structure

    // Check if message is succesfully sent. If not, close client application
        if (iResult == SOCKET_ERROR)
        {
            printf("sendto failed with error: %d\n", WSAGetLastError());
            closesocket(clientSocket);
            WSACleanup();
            return 1;
        }
    }
    // Only for demonstration purpose
    printf("Press any key to exit: ");
    _getch();

    // Close client application
    iResult = closesocket(clientSocket);
    if (iResult == SOCKET_ERROR)
    {
        printf("closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Close Winsock library
    WSACleanup();

    // Client has succesfully sent a message
    return 0;
}

1 Ответ

0 голосов
/ 03 декабря 2018

Я добавил простое утверждение If, если вы не можете подключиться к этому порту, просто подключитесь к следующему "15012"

// UDP client that uses blocking sockets
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include "conio.h"

#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define SERVER_IP_ADDRESS "127.0.0.1"       // IPv4 address of server
#define SERVER_PORT 15000                   // Port number of server that will be used for communication with clients
#define BUFFER_SIZE 512                     // Size of buffer that will be used for sending and receiving messages to client


int main()
{
    // Server address structure
    sockaddr_in serverAddress, clientAdress;

    // Size of server address structure
    int sockAddrLen = sizeof(serverAddress);

    // Buffer that will be used for sending and receiving messages to client
    char dataBuffer[BUFFER_SIZE];

    // WSADATA data structure that is used to receive details of the Windows Sockets implementation
    WSADATA wsaData;

    // Initialize windows sockets for this process
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    // Check if library is succesfully initialized
    if (iResult != 0)
    {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    // Initialize memory for address structure
    memset((char*)&serverAddress, 0, sizeof(serverAddress));

    // Initialize address structure of server
    serverAddress.sin_family = AF_INET;                             // IPv4 address famly
    serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);   // Set server IP address using string
    serverAddress.sin_port = htons(SERVER_PORT);                    // Set server port


    memset((char*)&clientAdress, 0, sizeof(clientAdress));

    // Initialize address structure of server
    clientAdress.sin_family = AF_INET;                              // IPv4 address famly
    clientAdress.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);    // Set server IP address using string
    clientAdress.sin_port = htons(15011);                   // Set server port


    // Create a socket
    SOCKET clientSocket = socket(AF_INET,      // IPv4 address famly
        SOCK_DGRAM,   // Datagram socket
        IPPROTO_UDP); // UDP protocol


    iResult = bind(clientSocket, (SOCKADDR *)&clientAdress, sizeof(clientAdress));

    if (iResult == SOCKET_ERROR)
    {
        clientAdress.sin_family = AF_INET;                              // IPv4 address famly
        clientAdress.sin_addr.s_addr = inet_addr(SERVER_IP_ADDRESS);    // Set server IP address using string
        clientAdress.sin_port = htons(15012);                   // Set server port

        iResult = bind(clientSocket, (SOCKADDR *)&clientAdress, sizeof(clientAdress));

        if (iResult == SOCKET_ERROR) {

            printf("Socket bind failed with error: %d\n", WSAGetLastError());
            closesocket(clientSocket);
            WSACleanup();
            return 1;

        }
    } 


// Check if socket creation succeeded
    if (clientSocket == INVALID_SOCKET)
    {
        printf("Creating socket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    while (1) {
        printf("Enter message to send:\n");

        // Read string from user into outgoing buffer
        gets_s(dataBuffer, BUFFER_SIZE);

        // Send message to server
        iResult = sendto(clientSocket,                      // Own socket
            dataBuffer,                     // Text of message
            strlen(dataBuffer),             // Message size
            0,                                  // No flags
            (SOCKADDR *)&serverAddress,     // Address structure of server (type, IP address and port)
            sizeof(serverAddress));         // Size of sockadr_in structure

    // Check if message is succesfully sent. If not, close client application
        if (iResult == SOCKET_ERROR)
        {
            printf("sendto failed with error: %d\n", WSAGetLastError());
            closesocket(clientSocket);
            WSACleanup();
            return 1;
        }
    }
    // Only for demonstration purpose
    printf("Press any key to exit: ");
    _getch();

    // Close client application
    iResult = closesocket(clientSocket);
    if (iResult == SOCKET_ERROR)
    {
        printf("closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Close Winsock library
    WSACleanup();

    // Client has succesfully sent a message
    return 0;
}
...