SSL_connect(ssl)
お世話になっています。
VC++2005、MFC、Win7、openssl で作業しています。
Gメールから、POP3S 接続でメールを受け取りたいと考えています。
メールヘッダーの受信後に、本文を取り出す前に接続が切れます。
最初に、接続の部分ですが、問題点がありましたら、アドバイスをください。
void CSQMailBoxTreeView::GmailMailDL(){
int nReturnCode;
WSADATA wsaData;
CFileException fileExpection;
#define MAJOR_VERSION_REQUIRED 1
#define MINOR_VERSION_REQUIRED 1
struct sockaddr_in server;
std::string req; // リクエスト
std::string res; // レスポンス
std::string host_url = "pop.googlemail.com";
strcpy_s(gszGmailServerName,(LPCTSTR)oc_Gmailpop3servername);
if(strlen(gszGmailServerName)==0){
MessageBox("設定 - Gmail POP3サーバー から、\n受信メール(POP3)サーバを\n入力して下さい。","POP Server", MB_OK);
}
strcpy_s(gszGmailUserId, (LPCTSTR)oc_Gmailpop3userid);
if(strlen(gszGmailUserId)==0){
MessageBox("設定 - Gmail POP3サーバー から、\nメールサーバのユーザ名を\n入力してください。","POP User ID", MB_OK);
}
strcpy_s(gszGmailPassword, (LPCTSTR)oc_Gmailpop3password);
if(strlen(gszGmailPassword)==0){
MessageBox("設定 - Gmail POP3サーバー から、\nパスワードを入力してください。","警告 PassWord", MB_OK);
}
strcpy_s(gszGmailPOP3Port, (LPCTSTR)oc_Gmailpop3port);
if(strlen(gszGmailPassword)==0){
MessageBox("設定 - Gmail POP3サーバー から、\nポート番号を入力してください。","POP3 PortNumber", MB_OK);
}
// Prepare version for WSAStartup()
WORD wVersionRequired = MAKEWORD(MAJOR_VERSION_REQUIRED, MINOR_VERSION_REQUIRED);
// Initialize the WinSock DLL
nReturnCode = WSAStartup(wVersionRequired, &wsaData);
if (nReturnCode != 0 ){
MessageBox("Error on WSAStartup()", "CheckGMail", MB_OK);
return ;
}
// Confirm that the version requested is available.
if (wsaData.wVersion != wVersionRequired){
// Version needed is not available.
MessageBox("Wrong WinSock Version", "CheckGMail", MB_OK);
WSACleanup();
return ;
}
sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_port = htons(995);
server.sin_addr.S_un.S_addr = inet_addr(host_url.c_str());
if (server.sin_addr.S_un.S_addr == 0xffffffff) {
struct hostent *host;
unsigned int **addrptr;
host = gethostbyname(host_url.c_str());
if (host == NULL) {
return ;
}
addrptr = (unsigned int **)host->h_addr_list;
while (*addrptr != NULL) {
server.sin_addr.S_un.S_addr = *(*addrptr);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) == 0) {
break;
}
}
if (*addrptr == NULL) {
sprintf_s(outbuf3, "Fatal error: unable to connect to the server.\n");
MessageBox(outbuf3,"Error", MB_OK);
WSACleanup();
return;// -1;
}
}
else {
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) != 0){
return ;
}
}
SSL_load_error_strings();
SSL_library_init();
ctx = SSL_CTX_new(TLSv1_method());
if (ctx == NULL) {
return;// 1;
}
ssl = SSL_new(ctx);
if (ssl == NULL) {
return;// 1;
}
if (SSL_set_fd(ssl, sock) == 0) {
return;// 1;
}
RAND_poll();
while (RAND_status() == 0) {
unsigned short rand_ret = rand() % 65536;
RAND_seed(&rand_ret, sizeof(rand_ret));
}
int ev = SSL_connect(ssl);
if ( ev != 1) {
int ret = SSL_get_error(ssl, ev);
if(ret <= 0){
ERR_print_errors_fp(stderr);
return;// 1;
}
}
if (WSAAsyncSelect(sock, *this, SM_GASYNC3,
FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE) == SOCKET_ERROR){
MessageBox("WSAAsyncSelect() failed","Error", MB_OK);
closesocket(sock);
sock = INVALID_SOCKET;
return;
}
gnAppState = STATE_CONNECTING;
}
補足
ありがとうございます。 クライアントはWindowsなんですが、 サーバはUNIXを使います。 また、ソケット通信は必須条件なのです。 非常に面倒ですか…頑張るしかないですけど。。 やはり英語の資料漁るしかないんでしょうか。。