2014-11-19 3 views
0

POP3 서버에 간단하게 연결하고 대기중인 메시지 수를 얻는 방법을 찾는데 적어도 지난 2 시간을 보냈습니다. C#에서는 쉽게 할 수 없지만 리눅스에서는 C++에서 매우 기본적인 것처럼 보입니다. Windows에서 작동하도록 만드는 방법에 대한 약간의 튜토리얼을 찾을 수 없습니다.POP3 서버 - 원시 C++의 기본 클라이언트 작업

타사 라이브러리를 사용하고 싶지 않습니다. 단순한 콘솔 프로그램을 코딩하고, 원시 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. 나는 (일부 도움) 리눅스에서 작동해야하는 간단한 조각 작성한

난 그냥 어떤 간단한 솔루션을 찾을 수 없습니다

... - 적어도 튜토리얼에 따라; 나는 그것을 지금 확인할 방법이 없다. Hovewer, C++은 제 "모국어"가 아니며 Windows로 전송하려고 할 때 한 구멍에서 다른 구멍으로 넘어가 GGoogle에서 솔루션을 한 시간 더 보내야합니다.

이 시점에서 코드는 컴파일 중이지만 링커는 실패합니다. 링커에 ws2_32.lib을 추가했기 때문에 이상합니다. 따라서 잘 작동해야합니다. 그 대신에, 나는 단지 LNK2019의 하중만을 얻습니다.

코드로 도움을 주거나 Windows에서 작동하는 간단한 솔루션에 대한 링크를 제공 할 수 있습니까?

코드 :

#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"); 
} 
+1

[이 (https://social.msdn.microsoft.com/Forums/vstudio/en-US/cfefa4a5-1f1a-4987-8bc7 -f3197cb5826c/how-to-link-ws232lib? forum = vcgeneral) 도움이 될까요? – Vincent

+0

@Vincent 감사합니다. 적어도 제대로 연결되었지만 getservbyname()에서 프로그램 반환이 실패합니다 ... –

+1

['WSAGetLastError'] 시도 (http://msdn.microsoft.com/en-us/library/ windows/desktop/ms741580 (v = vs.85) .aspx)을 사용하여 확장 된 오류 정보를 얻을 수 있습니다. – Vincent

답변

1

당신은 당신이 어떤 윈속 기능을 사용하기 전에 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();