2016-02-24 4 views
1

Я начинаю программировать сокеты в C. Я получил код в книге, и когда я скомпилирован, это следующая ошибка с неопределенной ссылкой. Пожалуйста, дайте советы, чтобы исправить это! Спасибо!C-Socket Programming- "undefined reference"

Код:

#include <stdio.h> 
#include <winsock.h> 
#include <winsock2.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#define RCVBUFSIZE 32 
int main(int argc, char *argv[]){ 
int sock; 
struct sockaddr_in echoServAddr; 
unsigned short echoServPort; 
char *servIP; 
char *echoString; 
char echoBuffer[RCVBUFSIZE]; 
unsigned int echoStringLen; 
int bytesRcvd, totalBytesRcvd; 
if(argc>3 || argc>4){ 
    printf("Usage: %s <Server IP> <Echo Word> [<Echo Port>\n",argv[0]); 
    exit(1); 
} 
servIP=argv[1]; 
echoString=argv[2]; 
if(argc==4){ 
    echoServPort=atoi(argv[3]); 
} 
else{ 
    echoServPort=7; 
} 
if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0){ 
    printf("socket() failed!"); 
} 
memset(&echoServAddr,0,sizeof(echoServAddr)); 
echoServAddr.sin_family=AF_INET; 
echoServAddr.sin_addr.s_addr=inet_addr(servIP); 
echoServAddr.sin_port=htons(echoServPort); 
if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){ 
    printf("connect() failed!"); 
} 
echoStringLen=strlen(echoString); 
if(send(sock,echoString, echoStringLen,0)!=echoStringLen){ 
    printf("send() send maximum bytes than expected"); 
} 
totalBytesRcvd=0; 
printf("Received"); 
while(totalBytesRcvd<echoStringLen){ 
    if((bytesRcvd=recv(sock,echoBuffer,RCVBUFSIZE-1,0))<=0){ 
     printf("recv() failed!"); 
    } 
    totalBytesRcvd+=bytesRcvd; 
    echoBuffer[bytesRcvd]='\0'; 
    printf(echoBuffer); 
} 
close(sock); 
exit(1);  
} 

Я получил ошибки следующим образом:

In function `main': 
     client.cpp:34: undefined reference to `[email protected]' 
     client.cpp:39: undefined reference to `[email protected]' 
     client.cpp:40: undefined reference to `[email protected]' 
     client.cpp:41: undefined reference to `[email protected]' 
     client.cpp:45: undefined reference to `[email protected]' 
     client.cpp:51: undefined reference to `[email protected]' 
     collect2.exe [Error] ld returned 1 exit status 
+3

Вы забыли связать с библиотекой Ws2_32.lib –

+0

Как связать с библиотекой Ws2_32.lib? Я использую Dev C++ IDE. –

+0

Посмотрите документацию dev-C++. –

ответ

2

Из моих наблюдений, вы пытаетесь построить приложение Winsock с MinGW.

MinGW, по умолчанию, не используйте ссылку Winsock библиотеки (которая Ws2_32.lib) автоматически, так что вам нужно вручную сказать компилятору, используя -l флага плюс имя вашей библиотеки.

gcc winsock.c -o winsock.exe -lws2_32 

Edit: Если вы IDE, которые с помощью MinGW люкс (Код :: Блок, DevC++ и т.д.), вы можете попытаться найти вариант, где вы можете вручную добавить флаги компилятора, а также добавить -lws2_32 в на ваш флаг компилятора


Edit: на основе вашего комментария выше, так что вы используете ++ IDE Dev-C, ниже руководство, как вы можете использовать библиотеку ws2_32.lib внутри IDE

  1. Перейти к началу меню Tools и нажмите Compiler Options...

    enter image description here

  2. Внутри Compiler Options, отметьте флажок Add the following commands when calling the compiler

  3. флаг Put компилятор -lws2_32 ниже в текстовое поле

    enter image description here

  4. Нажмите OK

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

С уважением

+0

Спасибо большое :) –

+0

@Nguyen Tan Dat, если мой ответ вам помог, Принять', чтобы отметить, что на этот вопрос был дан ответ :) –