Я подключаю к своему проекту <Winsock2.h>
почему Visual C++ 6.0 выдает ошибки:
prog.obj : error LNK2001: unresolved external symbol __imp__connect@12
prog.obj : error LNK2001: unresolved external symbol __imp__inet_addr@4
prog.obj : error LNK2001: unresolved external symbol __imp__socket@1
prog.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
prog.obj : error LNK2001: unresolved external symbol __imp__gethostname@8
Release/prog.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
Эти ошибки исчезают, если я включаю в поект файл Ws2_32.lib.
У меня с некоторыми функциями всегда такая фигня.
От чего это зависит? Что Visual просто не знает путь к нужной библиотеки?
Но это так, фигня, меня больше интересует программирование сокетов,
я стал этим заниматься и у меня возникли некоторые вопросы:
Я разбирался с кодом одной программы, отправляющей письмо на
почтовый сервер. Вот кусок кода из нее:
#define RECIEVE(code)\
{\
a = recv(s, sz1, sizeof(sz1), NULL);\
if (a == SOCKET_ERROR) goto goto_on_error;\
sz1[a] = 0;\
if (!strstr(sz1, code)) goto goto_on_error;\
}
#define SEND(data, datalen)\
{\
b = 0;\
while (b < datalen) {\
a = send(s, (char*) (data + b), datalen - b, NULL);\
if (a == SOCKET_ERROR) goto goto_on_error;\
b += a;\
};\
}
// открыть сокет
s = socket(AF_INET, SOCK_STREAM, NULL);
if (s == INVALID_SOCKET) goto goto_on_error;
// получить данные о сервере
ulAddress = inet_addr(HOST_NAME);
if (ulAddress == INADDR_NONE) {
ptrHost = gethostbyname(HOST_NAME);
if (!ptrHost) goto goto_on_error;
memcpy(&sin.sin_addr, ptrHost->h_addr_list[0], sizeof(IN_ADDR));
} else {
memcpy(&sin.sin_addr, &ulAddress, 4);
};
sin.sin_family = AF_INET;
sin.sin_port = htons(HOST_PORT);
// установить соединение с сервером
if (connect(s, (PSOCKADDR)&sin, sizeof(SOCKADDR))) goto goto_on_error;
RECIEVE("220");
// отправить письмо
gethostname(sz2, sizeof(sz2));
sprintf(sz1, "HELO %s\r\n" ,sz2);
SEND(sz1, strlen(sz1)); // hello server
RECIEVE("250");
sprintf(sz1, "MAIL FROM:<%s>\r\n", MAIL_FROM);
SEND(sz1, strlen(sz1)); // mail from
RECIEVE("250");
sprintf(sz1, "RCPT TO:<%s>\r\n", MAIL_TO);
SEND(sz1, strlen(sz1)); // mail to
RECIEVE("25");
strcpy(sz1, "DATA\r\n");
SEND(sz1, strlen(sz1)); // data begin
RECIEVE("354");
Здесь мне непонятна фу-я макроса RECIEVE, что значат
RECIEVE("25"); RECIEVE("250"); и т.д. и зачем слать серверу
строку HELO: gethostname(sz2, sizeof(sz2));
sprintf(sz1, "HELO %s\r\n" ,sz2);
SEND(sz1, strlen(sz1)); // hello server
где бы можно было обо всем об этом почитать?
Я нашел только статью Танаева, но там все довольно поверхностно.
Где бы взять что-нибудь в стиле Рихтера?
Может кто знает хорошую лит-ру по программированию сокетов и
вообще по сетевому программированию.
> Я подключаю к своему проекту <Winsock2.h> > почему Visual C++ 6.0 выдает ошибки: > ... > Эти ошибки исчезают, если я включаю в поект файл > Ws2_32.lib. > У меня с некоторыми функциями всегда такая фигня. > От чего это зависит? Что Visual просто не знает путь к > нужной библиотеки?
Он то знает, но стремится не включать в проект не нужные библиотеки.
А ошибка указанная тобой означает, что эта функция не найдена ни в одном из линкуемых файлов.
В мсдне про каждую функцию написано в какой она либе - если используешь функцию - должен дописать и либу в список либ.
(кстати очень удобно: в исходнике "#pragma comment(lib,"ws2_32.lib")" писать)
> Но это так, фигня, меня больше интересует программирование > сокетов, > я стал этим заниматься и у меня возникли некоторые вопросы: > > ... > Здесь мне непонятна фу-я макроса RECIEVE, что значат > RECIEVE("25"); RECIEVE("250"); и т.д. и зачем слать
Это значит сообщить об ошибке пользователю, если сервер вернул не 25, 250.
> Он то знает, но стремится не включать в проект не нужные > библиотеки. > А ошибка указанная тобой означает, что эта функция не > найдена ни в одном из линкуемых файлов. > В мсдне про каждую функцию написано в какой она либе - если > используешь функцию - должен дописать и либу в список либ. > (кстати очень удобно: в исходнике "#pragma > comment(lib,"ws2_32.lib")" писать)
Когда я включаю библиотеку выдается предупреждение?
LINK : warning LNK4089: all references to "WS2_32.dll" discarded by /OPT:REF
> > Здесь мне непонятна фу-я макроса RECIEVE, что значат > > RECIEVE("25"); RECIEVE("250"); и т.д. и зачем > слать > > Это значит сообщить об ошибке пользователю, если сервер > вернул не 25, 250. Это я понял, но что значат 25, 250. Это тоже специфика SMTP?
> > где бы можно было обо всем об этом почитать? > Про SMTP (Simple Mail Transfer Protocol) - RFC 821. А есть где нибудь в инете RFC 821 на русском или что-нибудь похожее по SMTP?
Спасибо
Vital
[C++] Программирование сокетов и вообще20.06.01 18:53 Автор: Бяша <Biasha> Статус: Member Отредактировано 20.06.01 18:58 Количество правок: 1
> Когда я включаю библиотеку выдается предупреждение? > LINK : warning LNK4089: all references to "WS2_32.dll" > discarded by /OPT:REF как ты его включаешь ?
это сообщение выдается, когда программа игнорирует все ехпортируемые ф-ии из длл-ки.
> > Когда я включаю библиотеку выдается предупреждение? > > LINK : warning LNK4089: all references to "WS2_32.dll" > > discarded by /OPT:REF > как ты его включаешь ? > это сообщение выдается, когда программа игнорирует все > ехпортируемые ф-ии из длл-ки.
> > Включаю так: > > #include <Winsock2.h> > > #include <ras.h> > > > > #pragma comment(lib,"ws2_32.lib") > > #pragma comment(lib,"rasapi32.lib") > > понятно, а в Settings-ах не включал? > > или еще попробуй так : > > #pragma comment(linker, "/NODEFAULTLIB:ws2_32.lib") > #pragma comment(lib, "ws2_32.lib")
Не, так не работает, но вот когда я
включил ws2_32.lib в список библиотек в project->setting->link
все заработало.
А вообще, когда я писал просто
#pragma comment(lib, "ws2_32.lib")
при компиляции иногда выдавалось предупреждение, а иногда нет.
Чем это объяснить?