我在过去的至少两个小时中一直在寻找一种方法来建立与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

我似乎找不到任何简单的解决方案...

我写了(在一些帮助下)一个简单的片段,应该在linux上工作-至少根据教程而言;我现在无法检查它。
但是,C ++不是我的“母语”,当我尝试将其转移到Windows时,我只是从一个孔中钻了一个孔,而不得不花另外一个半小时的时间来解决这个问题。

此时,代码正在编译,但是链接器失败。奇怪,因为我已经将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");
}

最佳答案

使用任何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();

关于c++ - POP3服务器-原始C++中的基本客户端操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27023071/

10-16 05:15