4

I am trying to make a simple UDP socket class to do some talking between a c++ program and a java program so I'm trying to make a socket class that handles all the UDP transmission but I can't get the program to compile because I get about 8 lnk2019 errors and I have no idea what they even mean. I mainly work in Java and only use c++ when I have to lol. I have 3 files the socket header and code. Also the Udp Socket code is from rFactor-Nesim so the socket code isn't written by me.

UdpSocket.cpp

#include "UdpSocket.hpp"

#include <stdio.h>

UdpSocket::UdpSocket(const char* host, int port) 
: mHost(host), mPort(port)
{
}

UdpSocket::~UdpSocket(void)
{
}

void UdpSocket::Open()
{
if(WSAStartup(MAKEWORD(2, 0), &mWinsockData) != 0)
    fprintf(stderr, "WSAStartup() failed");   

if ((mSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    perror("socket() failed");   

memset(&mSocketAddress, 0, sizeof(mSocketAddress));
mSocketAddress.sin_family = AF_INET;
mSocketAddress.sin_addr.s_addr = inet_addr(mHost);
mSocketAddress.sin_port = htons(mPort);
}

void UdpSocket::Close()
{
closesocket(mSocket);  
WSACleanup();
}

void UdpSocket::Send(char* str, size_t length)
{
size_t result = sendto(mSocket, str, length, 0, 
    (struct sockaddr *) &mSocketAddress, sizeof(mSocketAddress));

if(result != length)
    perror("sendto() sent incorrect number of bytes");   
}

UdpSocket.hpp

#ifndef UDPSOCKET_HPP
#define UDPSOCKET_HPP

#include <WinSock.h>

class UdpSocket
{
public:
UdpSocket(const char* host, int port);
~UdpSocket(void);

void Send(char* str, size_t length);

void Open();
void Close();
private:
const char* mHost;
int mPort;
int mSocket;
struct sockaddr_in mSocketAddress;
WSADATA mWinsockData;
};

#endif // UDPSOCKET_HPP

and the main

#include "Socket/UdpSocket.hpp"
#include <iostream>


int Main(){
UdpSocket* testSocket = new UdpSocket("127.0.0.1", 27469);
testSocket->Open();
system("pause");
return 0;
}

Any help would be great. I'm not very strong with c++ but I have done a little bit

Console Ouput:

Error   1   error LNK2019: unresolved external symbol __imp__htons@4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   2   error LNK2019: unresolved external symbol __imp__inet_addr@4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   3   error LNK2019: unresolved external symbol __imp__socket@12 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ) UdpSocket.obj   SocketTest
Error   4   error LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)  UdpSocket.obj   SocketTest
Error   5   error LNK2019: unresolved external symbol __imp__WSACleanup@0 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close@UdpSocket@@QAEXXZ)    UdpSocket.obj   SocketTest
Error   6   error LNK2019: unresolved external symbol __imp__closesocket@4 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   7   error LNK2019: unresolved external symbol __imp__sendto@24 referenced in function "public: void __thiscall UdpSocket::Send(char *,unsigned int)" (?Send@UdpSocket@@QAEXPADI@Z)  UdpSocket.obj   SocketTest
Error   8   error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup   MSVCRTD.lib SocketTest
Error   9   fatal error LNK1120: 8 unresolved externals C:\Users\Brendan\Documents\Visual Studio 2008\Projects\SocketTest\Debug\SocketTest.exe  SocketTest
user207421
  • 305,947
  • 44
  • 307
  • 483
Brendan Russo
  • 176
  • 3
  • 11

2 Answers2

7

It sounds like you're failing to link against Winsock - Ws2_32.lib

If you're building from the command line, add Ws2_32.lib to your link command line.

If you're building from Visual Studio, look for linker flags/settings inside a project configuration dialog.

simonc
  • 41,632
  • 12
  • 85
  • 103
0

when you have code in several implementation files, you need to compile all those implementation files and pass the resulting object code files to the linker, which combines them (and other stuff) into an executable

it's not enough to include the header of a module

c++ doesn't (yet) have any technical module concept, so including headers does not magically compile implementation files or pass object code files to the linker

this is not part of the c++ standard, but it's part of everyday tool usage

the linker is telling you that you failed to provide it with object code for your class member functions the Winsock library

that object code is provided by the library file, in visual c++ typically with filename extension ".lib"


in general, when you get a mysterious error, just look up the error number in the documentation

in visual studio that's as simple as pressing the F1 key

Cheers and hth. - Alf
  • 142,714
  • 15
  • 209
  • 331
  • No. If you read the errors carefully, your linker is telling you that you failed to provide it with object code for the following functions: htons, inet_addr, socket, WSAStartup, WSACleanup, closesocket, sendto and main. Those are socket functions, with the exception of the entrance point. They're not class member functions. – autistic Feb 25 '13 at 10:00
  • @modifiablelvalue: maybe your browser fails to display the strike-through for "your class member functions". does it? or if it does, maybe you failed to understand its significance. well it denotes "deleted". consider that i added that overstrike in an edit before the time limit on original modification expired, so that it's not even in the history, and so that if i wanted to hide it, i could very easily have done that. but i didn't, instead i chose to show it. now why do you think that i did that? – Cheers and hth. - Alf Feb 25 '13 at 10:04