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



我有个小问题,我有一个服务器和客户端应用程序。

这里我想要的是,当我运行Server+Client时,消息是从端口15011接收的,因为我已经将其绑定在Client文件中,但我想同时运行两个客户端,然后我从端口15011中接收消息,其中一个是随机分配的,我想从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: %dn", 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: %dn", 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: %dn", 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: %dn", WSAGetLastError());
WSACleanup();
return 1;
}
// Close Winsock library
WSACleanup();
// Client has succesfully sent a message
return 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: %dn", 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: %dn", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 1;
}
} 

// Check if socket creation succeeded
if (clientSocket == INVALID_SOCKET)
{
printf("Creating socket failed with error: %dn", 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: %dn", 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: %dn", WSAGetLastError());
WSACleanup();
return 1;
}
// Close Winsock library
WSACleanup();
// Client has succesfully sent a message
return 0;
}

相关内容

  • 没有找到相关文章

最新更新