具有2个客户端的UDP服务器,如何为它们分配特定的端口

时间:2018-12-03 19:03:38

标签: c udp winsock winsock2

我有一个小问题,我有一个Server和Client应用程序。

这是我想要的,当我运行服务器+客户端时,因为已将其绑定到客户端文件中,所以从端口15011接收到消息,但是我想一次运行2个客户端,然后收到消息从端口15011随机分配一个,我希望从15012接收第二个客户端消息。

如果我有一条IF语句,它会检查该端口是否空闲,然后将其占用的端口+ 1,甚至有可能。任何建议对我都会有很大帮助。

谢谢前进!

import org.junit.Test;
import org.junit.runner.RunWith;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import static org.junit.Assert.*;

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        Context appContext = ApplicationProvider.getApplicationContext();
        assertEquals("XXX", appContext.getPackageName());
    }
}

1 个答案:

答案 0 :(得分:0)

我添加了一个简单的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;
}