Windows Socket Программирование на С - PullRequest
4 голосов
/ 21 июля 2011

Я беру урок сетевого общения, где профессор буквально читает книгу классу.Само собой разумеется, я понятия не имею, что я делаю.Наш семестровый проект состоит в том, чтобы скопировать код из нашего учебника и создать сеть клиент-сервер.Буквальное копирование кода из книги без изменений.

В книге были ошибки в коде (пропущены точки с запятой, лишний паратез), но мне удалось, по крайней мере, скомпилировать код.Однако я сталкиваюсь с кучей ошибок ссылок.

Пример: ошибка ошибки 1 LNK2019: неразрешенный внешний символ impsendto @ 24, указанный в функции _main C: \ Users \ Documents \ Visual Studio 2010 \ Projects \ Client_Server \ Client_Server\ Client_Server \ Server.obj Client_Server

Я посмотрел код ошибки и думаю, что код пытается связать определения, которых нет в заголовочных файлах.Мне трудно исправить ошибки LNK против ошибок синтаксиса.Но, как я уже сказал, я понятия не имею, как это исправить.Я отправляю код на стороне сервера, я столкнулся с теми же ошибками на стороне клиента.

include <stdio.h>
include <string.h>
include <WinSock2.h>
include <WinSock.h>
include <stdint.h>
include <time.h>

int main(void) {

int s;      
int len;
char  buffer[256];  
struct sockaddr_in servAddr; 
struct sockaddr_in clntAddr; 

int clntAddrLen; //length of client socket addre

//Build local (server) socket add

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(21);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

   //create socket
if((s=socket(PF_INET, SOCK_DGRAM, 0) <0 ))
{
   perror("Error: Socket Failed!");
    exit(1);
}

//bind socket to local address and port
if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr))<0))
{
    perror("Error:bind failed!");
    exit(1);
}

for(;;)
{
len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen);

    //send string
    sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr));
}

}

Будем благодарны за любые советы, ссылки на полезную информацию или советы.Я пытался читать учебник, но я полностью потерян.Кроме того, это единственное кодовое задание, которое мы выполняли весь семестр.Все остальное собирало пакеты, используя анализатор пакетов.Буквально вошел в класс и сказал, скопируйте и запустите код на странице X.

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

Вам нужно связать библиотеку Ws2_32.lib, чтобы использовать winsock.Вы также должны вызвать WSAStartup перед использованием любых других функций winsock (это не вызывает вашу текущую ошибку, но вызовет проблемы, как только вы исправите отсутствующую проблему библиотеки).

4 голосов
/ 23 августа 2013

Сначала я попытаюсь помочь в использовании вашего последнего комментария: допустим, вы используете Visual Studio (я думаю, что это лучший вариант для запуска winsock для программирования Windows, так как Microsoft заботится о том, чтобы базовые библиотеки Windows были современными, и онисовместимо с полезной поддержкой msdn).

Если вы получаете ошибку, такую ​​как эта: 1> asdf.obj: ошибка LNK2001: неразрешенный внешний символ _ imp _WSAStartup @ 8 это означает, что ws2_32.lib не правильно связан.Для этого щелкните правой кнопкой мыши ваш проект в обозревателе решений, перейдите в компоновщик -> input и добавьте ws2_32.lib в дополнительные зависимости.Эта библиотека является частью Windows SDK (я думаю, она установлена ​​вместе с большинством версий Visual Studio), поэтому убедитесь, что файл существует на вашем компьютере.

А теперь, как сделать правильный проект в современном стиле, не следуя инструкциямдревние уроки:

Библиотека, которую нужно добавить, - Winsock2.h.Winsock.h является старой (устаревшей) версией, и нет необходимости использовать ее в новых приложениях.Чтобы начать использовать сокеты, вам нужно вызвать функцию WSAStartup, для этого вы должны инициализировать struct WSADATA в начале.Основной фрагмент кода выглядит следующим образом:

#include <Winsock2.h>
int main()
{
WSADATA mywsadata; //your wsadata struct, it will be filled by WSAStartup
WSAStartup(0x0202,&mywsadata); //0x0202 refers to version of sockets we want to use.
//here goes your code with socket related things
return 0;
}

Для получения дополнительной помощи вы можете посетить здесь

Примечание: поскольку вопрос старый, а яне уверен, что его автор когда-нибудь посчитает мой ответ полезным Я хочу помочь другим пользователям, которые ищут этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...