Avatar billede lakana Nybegynder
03. september 2006 - 15:30 Der er 7 kommentarer og
1 løsning

får fejl i c++

hvad betyder disse nu:

  [Linker error] undefined reference to `WSAGetLastError@0'  [Linker error] undefined reference to `bind@12' 
[Linker error] undefined reference to `closesocket@4'

  [Linker error] undefined reference to `gethostbyname@4'


i denne kode






#include <time.h>
#include <errno.h>
#include <windows.h>
#include <string>
#include <iostream>
#include <stdlib.h>

#define TIMEOUT 5 // Max waiting time in sec

std::string SendReceive(char *hostname, int port, const std::string &cmd)
{
  int sd, status, len, ix, tmp;
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  fd_set ReadSet;
  struct timeval Time;

  // create
  sd = socket(AF_INET, SOCK_STREAM, 0);
  if(sd == SOCKET_ERROR)
  {
    std::cerr << "Error creating socket: " << WSAGetLastError() << std::endl;
    return "";
  }

  // bind
  local.sa_family = AF_INET;
  memset(local.sa_data, 0, sizeof(local.sa_data));
  status = bind(sd, &local, sizeof(local));
  if(status == SOCKET_ERROR)
  {
    std::cerr << "Error binding socket: " << WSAGetLastError() << std::endl;
    closesocket(sd);
    return "";
  }
  // lookup host
  hostinfo = gethostbyname(hostname);
  if(!hostinfo)
  {
    std::cerr << "Error looking up host: " << hostname << ", " << WSAGetLastError() << std::endl;
    closesocket(sd);
    return "";
  }

  // connect to host
  remote.sa_family = hostinfo->h_addrtype;
  memcpy(remote.sa_data + 2, hostinfo->h_addr_list[0], hostinfo->h_length);
  *((short *)remote.sa_data) = port;

  tmp = remote.sa_data[0];
  remote.sa_data[0] = remote.sa_data[1];
  remote.sa_data[1] = tmp;
  status = connect(sd, &remote, sizeof(remote));

  if(status)
  {
    std::cerr << "Error connecting to host: " << WSAGetLastError() << std::endl;
    closesocket(sd);
    return "";
  }
  // send request
  status = send(sd, cmd.c_str(), cmd.size(), 0);
  if(status == SOCKET_ERROR)
  {
    std::cerr << "Error sending request: " << WSAGetLastError() << std::endl;
    closesocket(sd);
    return "";
  }

  // read response */
  char resp[128]; // Read at most 128 bytes
  ix = 0;
  memset(&ReadSet, 0, sizeof(ReadSet));
  FD_SET(sd, &ReadSet);
  Time.tv_sec = TIMEOUT;
  Time.tv_usec = 0;
  len = 1;

  while(len > 0 && select(sd + 1, &ReadSet, 0, 0, &Time) > 0)
  {
    len = recv(sd, resp + ix, sizeof(resp) - ix - 1, 0);
    ix += len;
    Time.tv_sec = TIMEOUT;
    Time.tv_usec = 0;
  }
  resp[ix] = 0;
  closesocket(sd);

  return resp;
}

int main()
{
  WSADATA wsaData;
  WSAStartup(MAKEWORD(1, 1), &wsaData);

  std::string Responce = SendReceive("messenger.hotmail.com", 1863, "VER 1 MSNP10 CVR0\r\n");
  std::cout << "Received: " << Responce << std::endl;
}
Avatar billede arne_v Ekspert
03. september 2006 - 16:12 #1
at du skal linke mod ws2_32
Avatar billede lakana Nybegynder
03. september 2006 - 17:10 #2
har sat paramete til -ws2_32
Avatar billede arne_v Ekspert
03. september 2006 - 17:35 #3
hvis en GCC variant så:

-lws2_32

som vil finde libws2_32.a
Avatar billede mollevp Nybegynder
04. september 2006 - 08:36 #4
Jeg har ikke så meget erfaring med windows socket programmering, men mangler du ikke også at:
#include <winsock.h>
Avatar billede arne_v Ekspert
04. september 2006 - 16:19 #5
windows.h plejer at include den
Avatar billede mollevp Nybegynder
04. september 2006 - 18:03 #6
Ahh, ok :)
Avatar billede lakana Nybegynder
06. september 2006 - 23:13 #7
hm
Avatar billede v0id Nybegynder
17. september 2006 - 10:16 #8
Lige en lille noté:
I C++ bliver de gamle C-headers lavet om, så der ikke bruges .h i slutningen men et lille c i starten, altså <cstdlib> etc.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester