This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tests/LocalHost/main.cpp

117 lines
No EOL
3.3 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//*****************************************************************************
//
// Copyright (c) 2000 Westwood Studios. All Rights Reserved.
//
// localhost.cpp
//
// Created on 12 Apr 2001 by Tom Spencer-Smith (Westwood/Vegas)
//
// Description:
// Just a wee test to see if I can use localhost addressing (127.0.0.1)
// on non-networked systems...
//
//*****************************************************************************
#include <stdio.h>
#include <conio.h>
#include <winsock.h>
#include <assert.h>
//---------------------------------------------------------------------------
void main(void)
{
WSADATA winsock_data;
int rc_wsastartup = ::WSAStartup(MAKEWORD(1, 1), &winsock_data);
assert(rc_wsastartup == 0);
SOCKET sock = ::socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET)
{
::printf("::socket failed with error code %d\n", ::WSAGetLastError());
}
assert(sock != INVALID_SOCKET);
ULONG is_nonblocking = TRUE;
int rc_ioctl = ::ioctlsocket(sock, FIONBIO, &is_nonblocking);
assert(rc_ioctl == 0);
SOCKADDR_IN local_address;
local_address.sin_family = AF_INET;
local_address.sin_addr.s_addr = ::inet_addr("127.0.0.1"); // localhost
local_address.sin_port = ::htons(5555); // arbitrary
int rc_bind = ::bind(sock, reinterpret_cast<const SOCKADDR *>(&local_address),
sizeof(local_address));
assert(rc_bind == 0);
while (!::kbhit())
{
//
// Send a packet periodically
//
static DWORD last_send_time_ms = 0;
DWORD time_now_ms = ::timeGetTime();
const DWORD SEND_INTERVAL_MS = 500;
if (time_now_ms - last_send_time_ms > SEND_INTERVAL_MS)
{
last_send_time_ms = time_now_ms;
static int send_count = 0;
char send_data[200];
::sprintf(send_data, "packet_%d", send_count++);
int to_len = sizeof(local_address);
int rc_send = ::sendto(sock, send_data, ::strlen(send_data), 0,
(LPSOCKADDR) &local_address, to_len);
assert(rc_send != SOCKET_ERROR);
::printf("Sent %d bytes (%s) on socket %d\n", rc_send, send_data, sock);
}
//
// Receive all data available
//
int rc_recv = 0;
do
{
char recv_data[200];
::memset(recv_data, 0, sizeof(recv_data));
SOCKADDR_IN from_address;
int from_len = sizeof(from_address);
rc_recv = ::recvfrom(sock, recv_data, sizeof(recv_data), 0,
(LPSOCKADDR) &from_address, &from_len);
if (rc_recv > 0)
{
::printf("Recd %d bytes (%s) on socket %d\n", rc_recv, recv_data, sock);
}
else
{
assert(::WSAGetLastError() == WSAEWOULDBLOCK);
}
} while (rc_recv > 0);
}
int rc_cs = ::closesocket(sock);
assert(rc_cs == 0);
int rc_wsacleanup = ::WSACleanup();
assert(rc_wsacleanup == 0);
}