У меня небольшая проблема, у меня есть сервер и клиентские приложения.
И вот что я хочу, когда я запускаю сервер + клиент, сообщения приходят из порта 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;
}