我花了至少2个小时的时间来搜索与POP3服务器进行简单连接的方法并获取等待它的消息数量。由于它在C#中很容易使用,而且在Linux上的C ++中看起来非常基础,我甚至无法找到关于如何在Windows上运行它的最简单的教程。
我不想使用任何第三方库 - 我只想编写一个简单的控制台程序,仅使用原始C ++,只是为了做一些基本的东西,如上所述。我试图研究的所有资料都是:
POP3 is a protocol that has somethng to do with emails and it's very simple. Now let's proceed to writing a multi-platform POP3 server-client application, using a F16 fighter jet and inventing a time machine in progress
。
我似乎无法找到任何SIMPLE解决方案......
我已经写过(有一些帮助)一个应该在linux上工作的简单片段 - 至少根据教程;我现在没办法检查它。 Hovewer,C ++不是我的母语"当我尝试将其转移到Windows中时,我只是从一个洞落入另一个洞,并且还需要花费另外四分之一小时的GGoogle来解决这个问题。
此时,代码正在编译,但链接器失败。这很奇怪,因为我已经将ws2_32.lib
添加到链接器中,所以它应该可以正常工作。作为回报,我只能获得LNK2019
的负载。
您可以帮我解决一下代码,或者提供一个适用于Windows的SIMPLE解决方案的链接吗?
代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN 1
#include <winsock2.h>
#include <windows.h>
#else
#endif
#ifndef in_addr_t
#define in_addr_t long
#endif
#include <string.h>
void err(char *where) {
fprintf(stderr, "error in %s: %d\n", where, errno);
exit(1);
}
int main(int argc, char *argv[]) {
char *remote = "some_address";
struct servent *sent;
struct protoent *pent;
int port;
int sock;
int result;
in_addr_t ipadr;
struct sockaddr_in addr;
struct hostent *hent;
char buf[2048];
sent = getservbyname("http", "pop3");
if(sent == NULL)
err("getservbyname");
port = sent->s_port;
pent = getprotobyname("pop3");
if(pent == NULL)
err("getprotobyname");
hent = gethostbyname(remote);
printf("Host: %s\n", hent->h_name);
printf("IP: %s\n", inet_ntoa(*((struct in_addr *)hent->h_addr)));
addr.sin_family = AF_INET;
addr.sin_port = port;
addr.sin_addr = *((struct in_addr *)hent->h_addr);
memset(addr.sin_zero, '\0', 8);
sock = socket(AF_INET, SOCK_STREAM, pent->p_proto);
if(sock < 0)
err("socket");
result = connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
if(result < 0)
err("connect");
}
答案 0 :(得分:1)
在使用任何Winsock函数之前,您必须添加WSAStartup
。完成后,您必须致电WSACleanup
。
示例(来自msdn):
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return 1;
}
//Do stuf here
WSACleanup();