2013-02-25 3 views
4

Я пытаюсь сделать простой класс сокетов UDP, чтобы поговорить между программой C++ и программой java, поэтому я пытаюсь создать класс сокета, который обрабатывает всю передачу UDP, но я не могу получить программу для компиляции, потому что я получаю около 8 ошибок lnk2019, и я понятия не имею, что они означают. Я в основном работаю на Java и использую только C++, когда мне нужно lol. У меня 3 файла заголовок сокета и код. Также код Udp Socket от rFactor-Nesim, поэтому код сокета не написан мной.lnk2019 visual studio error

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 

и главный

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


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

Любая помощь будет большим. Я не очень силен с C++, но я сделал немного

консоль Ouput:

Error 1 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Open(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 2 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Open(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 3 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Open(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 4 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Open(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 5 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Close(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 6 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Close(void)" ([email protected]@@QAEXXZ) UdpSocket.obj SocketTest 
Error 7 error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UdpSocket::Send(char *,unsigned int)" ([email protected]@@[email protected]) 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 
+3

Позвольте мне получить мой волшебный стеклянный шар, чтобы посмотреть ваши сообщения об ошибках ... – us2012

+0

опубликуйте свои сообщения об ошибках и, желательно, снимок окна вывода. Там должны быть драгоценные камни –

+0

Не так сложно узнать, что означает эта ошибка: http://msdn.microsoft.com/de-de/library/799kze2z(v=vs.80).aspx – MFH

ответ

6

Это звучит, как вы не умея против Winsock - Ws2_32.lib

Если вы строите из командной строки, добавьте Ws2_32.lib в свою командную строку link.

Если вы работаете в Visual Studio, найдите флажки компоновщика/настройки в диалоговом окне конфигурации проекта.

+1

Действительно. В дополнение к этому, «Главная», вероятно, должна быть «главной». – Sebivor

+0

спасибо, что исправил все мои проблемы и теперь, по крайней мере, код работает без проблем –

+1

@simonc Awesome. Обозреватель решений -> Название проекта -> Свойства правой кнопки -> Коннектор -> Вход -> Дополнительные зависимости -> Изменить, добавить 'Ws2_32.lib' Thx! – zipzit

0

, когда у вас есть код в нескольких файлах реализации, вам нужно собрать все эти файлы реализация и передать полученному объектный код файлы линкер, который объединяет их (и другие вещи) в исполняемый

это не достаточно, чтобы включить заголовок модуля

C++ не (пока) есть какие-либо технические концепции модуля, так включая заголовки, не agically компилировать файлы реализация или передавать файлы объектного кода линкера

это не является частью C++ стандарт, но это часть использования повседневного инструмента

линкер говорят вам, что вы не в состоянии обеспечить его объектный код для ваших функций-членов класса библиотека Winsock

, что объектный код обеспечивается с помощью файла библиотеки, в Visual C++, как правило, с расширением имени файла «.lib»


в общем, когда вы получаете таинственное ошибку, просто посмотреть номер ошибки в документации

в визуальной студии, это столь же просто, как нажатие клавиши F1

+0

№. Если вы внимательно прочитали ошибки, ваш компоновщик сообщает вам, что вы не смогли предоставить его объекту код для следующих функций: htons, inet_addr, socket, WSAStartup, WSACleanup, closesocket, sendto и main. Это функции сокетов, за исключением точки входа. Они не являются функциями класса. – Sebivor

+0

@modifiablelvalue: возможно, ваш браузер не сможет отобразить пробой для «функций вашего класса». Имеет ли это? или, если это так, может быть, вы не поняли его значения. ну это означает «удаленный». подумайте, что я добавил, что чрезмерное изменение в редактировании до истечения срока действия оригинальной модификации истек, так что это даже не в истории, и поэтому, если бы я хотел скрыть это, я бы очень легко это сделал. но я этого не сделал, вместо этого я решил показать это. теперь почему вы думаете, что я это сделал? –