#define _CRT_SECURE_NO_WARNINGS
#include <windows.networking.sockets.h>
#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <string>
using namespace std;
#define BUF_LEN 128
struct Header
{
unsigned int MakeLength;
unsigned int ModelLength;
} head;
struct CarData
{
int Vin; //Unique Vehicle ID
char* Make; //A string containing the make of the car
char* Model; //A string containing the model of the car
float MSRP; //Suggest Manufacturers Retail Price in $
}car;
struct Packet
{
struct Header head;
struct CarData car;
};
char* SerializePacket(const struct Packet& packet, int& TotalSize)
{
TotalSize = sizeof(packet.head) + sizeof(packet.car.Vin) + packet.head.MakeLength + packet.head.ModelLength + sizeof(packet.car.MSRP);
// Allocate a buffer to hold the serialized data
char* buffer = new char[TotalSize];
// Copy the data from the CarData struct to the buffer
memcpy(buffer, &packet.head, sizeof(packet.head));
memcpy(buffer + sizeof(packet.head), &packet.car.Vin, sizeof(packet.car.Vin));
memcpy(buffer + sizeof(packet.head) + sizeof(packet.car.Vin), packet.car.Make, packet.head.MakeLength);
memcpy(buffer + sizeof(packet.head) + sizeof(packet.car.Vin) + packet.head.MakeLength, packet.car.Model, packet.head.ModelLength);
memcpy(buffer + sizeof(packet.head) + sizeof(packet.car.Vin) + packet.head.MakeLength + packet.head.ModelLength, &packet.car.MSRP, sizeof(packet.car.MSRP));
return buffer;
}
int main()
{
//starts Winsock DLLs
WSADATA wsaData;
if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
return 0;
}
//initializes socket. SOCK_STREAM: TCP
SOCKET ClientSocket;
ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ClientSocket == INVALID_SOCKET) {
WSACleanup();
return 0;
}
//Connect socket to specified server
sockaddr_in SvrAddr;
SvrAddr.sin_family = AF_INET; //Address family type itnernet
SvrAddr.sin_port = htons(27000); //port (host to network conversion)
SvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP address
if ((connect(ClientSocket, (struct sockaddr*)&SvrAddr, sizeof(SvrAddr))) == SOCKET_ERROR) {
closesocket(ClientSocket);
WSACleanup();
return 0;
}
/***********************************
* Your client code goes here *
************************************/
char buffer[128];
memset(buffer, 0, 128);
Packet packet;
memset(&packet, 0, sizeof(Packet));
cout << "Enter Vin: ";
cin >> packet.car.Vin;
cout << "Enter Make: ";
cin >> buffer;
packet.head.MakeLength = strlen(buffer) + 1;
packet.car.Make = (char*)malloc(packet.head.MakeLength);
strcpy(packet.car.Make, buffer);
packet.car.Make[packet.head.MakeLength - 1] = '\0';
memset(buffer, 0, sizeof(buffer));
cout << "Enter Model: ";
cin >> buffer;
packet.head.ModelLength = strlen(buffer) + 1;
packet.car.Model = (char*)malloc(packet.head.ModelLength);
strcpy(packet.car.Model, buffer);
packet.car.Model[packet.head.ModelLength - 1] = '\0';
cout << "Enter MSRP: ";
cin >> packet.car.MSRP;
int totalSize;
char* serializedPacket = SerializePacket(packet, totalSize);
send(ClientSocket, serializedPacket, totalSize, 0);
delete[] serializedPacket;
//closes connection and socket
closesocket(ClientSocket);
//frees Winsock DLL resources
WSACleanup();
return 1;
}