Я подключаю к своему проекту <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;\
};\
}
#define HOST_NAME "smtp.mail.ru"
#define HOST_PORT 25
#define SHORT_BUFFER_SIZE 0x100
char sz1[SHORT_BUFFER_SIZE], sz2[SHORT_BUFFER_SIZE];
WSADATA wsaData;
SOCKET s;
ULONG ulAddress;
HOSTENT *ptrHost;
SOCKADDR_IN sin;
// открыть сокет
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
где бы можно было обо всем об этом почитать?
Я нашел только статью Танаева, но там все довольно поверхностно.
Где бы взять что-нибудь в стиле Рихтера?
Может кто знает хорошую лит-ру по программированию сокетов и
вообще по сетевому программированию.
Заранее благодарен.
Vital.
|