Vista非同期接続でソケット関連のソフトを作成しているが、HandleAsyncMsg()関数が呼び出されない原因は何か?

このQ&Aのポイント
  • Vista非同期接続を使用してソケット関連のソフトを作成しています。
  • 特定のコードではHandleAsyncMsg()関数が呼び出されませんが、原因は何でしょうか?
  • 正常に呼び出すためにはどうすればよいですか?
回答を見る
  • ベストアンサー

Vista 非同期接続

Vista と VC++2005 でソケット関連のソフトを作っています。  下のようなコードでは BEGIN_MESSAGE_MAP(SQMailDLDlg, CDialog) // Don't show process //{{AFX_MSG_MAP(MailRecDlg2) ON_MESSAGE(SM_ASYNC, HandleAsyncMsg) //}}AFX_MSG_MAP END_MESSAGE_MAP() として、登録してある関数 HandleAsyncMsg() が呼び出されないのですが、 どこに原因があるのでしょうか? SendMessage(SM_ASYNC); とすれば、もちろん呼び出せます。 RetVal = getaddrinfo(gszServerName, Port, &Hints, &AddrInfo); if (RetVal != 0) { sprintf(outbuf3, "Cannot resolve address [%s] and port [%s], error %d: %s\n", Server, Port, RetVal, gai_strerror(RetVal)); WSACleanup(); return;// -1; } for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) { ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); if (ConnSocket == INVALID_SOCKET) { sprintf(outbuf3,"Error Opening socket, error %d: %s\n", WSAGetLastError(), DecodeError(WSAGetLastError())); continue; } if (WSAAsyncSelect(ConnSocket, *this, SM_ASYNC, FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT) == SOCKET_ERROR){ MessageBox("WSAAsyncSelect() failed","Error", MB_OK); closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } if (connect(ConnSocket, AI->ai_addr, AI->ai_addrlen) == SOCKET_ERROR){ if(WSAGetLastError() != WSAEWOULDBLOCK){ closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } break; } } if (AI == NULL) { sprintf(outbuf3, "Fatal error: unable to connect to the server.\n"); WSACleanup(); return;// -1; } よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

『SM_ASYNC』って独自のメッセージですよね そのメッセージを Post/Sendしてくれるのは誰なんでしょう Windowsはアプリケーション独自のメッセージの生成方法(タイミング)を知らないと思いますが ・・・

koinobori7
質問者

お礼

動きました。 HandleAsyncMsg(); の名前を変更して LRESULT CSQMailBoxTreeView::MailAsync(WPARAM , LPARAM lParam) としたら、 動き出しました。  ほかで、同じ名前を使っていたのが原因 かも知れませんが、何とかVista でも動きました。 ありがとうございました。

koinobori7
質問者

補足

SM_ASYNC』って独自のメッセージですよね そのメッセージを Post/Sendしてくれるのは誰なんでしょう これは、 Winsocket の仕事。  メールサーバーから FD_READ などが来たら SM_ASYNC を送る。 2000ではちゃんと動く。 Vista では動かない。 こんな現象で困っています。

関連するQ&A

  • winsockの非同期処理について

    winsockで双方向通信のため、非同期処理を行っているのですが、うまくいきません。 クライアント側で、WSAAsyncSelectの処理の後、Connectを呼んでいるのですが、Connectでエラーメッセージを返します。(エラーナンバー: 10035) サーバ側はaccept処理はうまくいっているのですが、accept後うまく処理を返していないためだと思うのですが... で質問は、 1.クライアント側、サーバ側にそれぞれ、WSAAsyncSelect を記載しても問題ないか? クライアント側はConnect前で宣言。 サーバ側はbind前で宣言しています。 2.エラー番号10035は非ブロッキングモードで処理されないためにおきています。 Connectで非ブロッキングモード処理がされていないためだと思うのですが、他に記述しないといけない関数があるのでしょうか? クライアント側: // 非同期処理 if(WSAAsyncSelect(client_s,this->m_hWnd, FM_TCPPROC, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE) == SOCKET_ERROR){ return FALSE; } // コネクト処理 memset(&client,0,sizeof(client)); client.sin_family = AF_INET; client.sin_addr.s_addr = inet_addr(IpAddress); client.sin_port = htons(PORT_NO); if(connect(client_s, (LPSOCKADDR)&client, sizeof(client)) == SOCKET_ERROR){ <-- ここでエラー long ErrNum = WSAGetLastError(); <-- ここでエラーNoがかえる。 return FALSE; }else{ NetFlg = true; } お分かりになる方教えてくださいませ。よろしくお願いします。

  • winsock2 非同期処理について

    教えてください。 winsockを使用して、ネットワーク間のアプリを作成しているのですが、 wndPorcが処理されないため困っています。 お分かりになる方教えてくださいませ。 送信側はメッセージを送っていますが、受信側のaccept処理が出来ません。(wndProcが呼ばれない) wndPorc関数って呼び出しって必要でしたか??? [環境] OS windows2000 Visual C++ 6.0 MFC [ソース] [.cpp内部] bool CSysCp02Dlg::NetWork_LogOn() { struct sockaddr_in server; // winsock初期処理 // ソケット作成 // 非同期処理 if(WSAAsyncSelect(server_s,this->m_hWnd,FM_TCPPROC,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE) == SOCKET_ERROR){  return false; } // 構造体をクリア // 設定 // bind処理 // 受付開始(listen処理) return true; } LRESULT CALLBACK CSysCp02Dlg::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) <----ここの関数が処理されない。 { struct sockaddr_in client; int n; char Recv_Buffer[RECV_SIZE]; int nLength = sizeof(client); switch(message) { case FM_TCPPROC: switch( lParam ){ case FD_ACCEPT: client_s = accept(server_s, (struct sockaddr *)&client, &nLength); if(client_s == INVALID_SOCKET){ ErrNum = WSAGetLastError(); } break; } } return WndProc(hWnd, message, wParam, lParam); } 800文字以内に入りきらないため、略してあります。

  • ソケットプログラミングで・・

    簡単なソケットプログラムを作ろうとしておりまして、サイトで調べたりしておりましたところ、なんとか分かってきたのですが、ひとつどうしてもわからないことがありますので教えていただけますでしょうか。 ソケットから受信するメッセージの生成のところなんですが、 「WSAAsyncSelect(m_socket,m_hWnd,WM_USER_ASYNC_SELECT,FD_READ | FD_WRITE)」 で、2番目の引数「m_hWnd」がわかりません。 教えていただけないでしょうか?よろしくお願いします。

  • Winsock Connnect タイムアウト について

    OS :WinXP SP3 言語:VC++ 2005 Winsock2の通信モジュールを開発中です。 connectのタイムアウト方法をネットで調べて下記の関数を 作成(完全引用)したのですが、上手くいきません。 WSAWaitForMultipleEventsでイベントが発生していない (接続先が存在しない)のですが処理が返ってきてしまいます。 何か間違っているのでしょうか?ご回答、宜しくお願い致します。 ----------------------------------------------------------------BOOL connect2 ( SOCKET aSock, char* dwAddr, int wPort, int nTimeout ) { int liRet, liErr, liRetflag = FALSE; unsigned long lulAddr = inet_addr ( dwAddr ); WSAEVENT hEvent; DWORD dwRet; WSANETWORKEVENTS Events; sockaddr_in Addr; // イベント作成 hEvent = WSACreateEvent(); if ( hEvent == WSA_INVALID_EVENT ) { return FALSE; } // イベント型に(自動的にノンブロッキングになる) liRet = WSAEventSelect( aSock, hEvent, FD_CONNECT ); if( liRet == SOCKET_ERROR ) { WSACloseEvent( hEvent ); return FALSE; } // 接続 ZeroMemory( &Addr, sizeof( Addr ) ); Addr.sin_family = AF_INET; Addr.sin_port = htons( ( unsigned short )wPort ); Addr.sin_addr.s_addr = lulAddr; if ( connect( aSock, ( struct sockaddr* )&Addr, sizeof( Addr ) ) == SOCKET_ERROR ) { liErr = WSAGetLastError(); // WSAEWOULDBLOCKの時はまだ接続されていないので続ける if ( liErr != WSAEWOULDBLOCK ) { goto END; } } *** ↓ここですぐ返ってきてしまい、WSA_WAIT_TIMEOUTにならない *** // イベント発生待機 dwRet = WSAWaitForMultipleEvents( 1, &hEvent, FALSE, 60000, FALSE ); // dwRetがWSA_WAIT_EVENT_0以外でエラー // dwRetがWSA_WAIT_TIMEOUTの時タイムアウト if ( dwRet != WSA_WAIT_EVENT_0 ) { goto END; } // どのイベントが発生したか liRet = WSAEnumNetworkEvents( aSock, hEvent, &Events ); if( liRet == SOCKET_ERROR ) goto END; // Events.iliErrorCode[FD_CONNECT_BIT]が0の場合成功 if( ( Events.lNetworkEvents & FD_CONNECT ) && Events.iErrorCode[FD_CONNECT_BIT] == 0 ) { liRetflag = TRUE; } END: // イベント型を終了 WSAEventSelect( aSock, NULL, 0 ); WSACloseEvent( hEvent ); // ブロッキングに戻す(必要なら) dwRet = 0; ioctlsocket( aSock, FIONBIO, &dwRet ); return liRetflag; } ----------------------------------------------------------------

  • ITです。早速ですがwinsockでURLを指定した接続確認をしたいの

    ITです。早速ですがwinsockでURLを指定した接続確認をしたいのですが、うまくいきません。 下記のソースで、URLを指定してinet_addr関数呼び出すと-1、 gethostbynameを呼び出すと0が却ってきてしまい、うまく接続出来ません。 IPアドレス(127.0.0.1)を指定すれば、上記の関数は成功するのですが。 URLからIPアドレスの変換方法が解りません。 どうか助けて下さい。 int main(int argc, char* argv[]) { WSADATA wsaData; sockaddr_in server; SOCKET sock; long err; hostent *host; char *url = "http://www.yahoo.co.jp"; // winsock2の初期化 err = WSAStartup(MAKEWORD(2,0), &wsaData); if (err != 0) { printf("WSAStartup error = %d\n", err); return(-1); } // ソケットの取得 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { printf("socket error = %d\n", WSAGetLastError()); return(-1); } // IPアドレスの取得 memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.S_un.S_addr = inet_addr(url); if (server.sin_addr.S_un.S_addr == -1) { host = gethostbyname(url); if (host == NULL) { printf("host not found host = %d\n", WSAGetLastError()); return(-1); } }

  • WinSockでの通信プログラムがうまくいきません

    WinSockでの通信プログラムがうまくいきません。 使用言語はC++とDirectXです。 ローカルでの通信(ルータを介したパソコン同士)はうまくいくんですが、別の場所にあるPCとの通信ができません。 以下実際に使用している関数です。 関数はマルチスレッドで動かしています。 WSADATA mWsaData; SOCKET mSockYou,mSockI; struct sockaddr_in mAddr; struct sockaddr_in mServer; struct sockaddr_in mClient; void CNetwork::Init(){ int err = WSAStartup( MAKEWORD( 2, 0 ), &mWsaData ); if( err != 0 ){ ERROR_EXIT(); return; } //Socket初期化 mSockI = socket( AF_INET, SOCK_STREAM, 0 ); if( mSockI == INVALID_SOCKET ){ ERROR_EXIT(); return; } mPort = 0; memset( mName, 0, sizeof( mName ) ); } //Server側 void CNetwork::Accept(){ FILE* fp; fopen_s( &fp, "messageLog.txt", "w" ); mAddr.sin_family = AF_INET; mAddr.sin_port = htons( mPort ); mAddr.sin_addr.S_un.S_addr = INADDR_ANY; if( bind( mSockI, (struct sockaddr *)&mAddr, sizeof( mAddr ) ) ) fprintf_s( fp, "bind失敗\n" ); if( listen( mSockI, 10 ) != 0 ) fprintf_s( fp, "listen失敗\n" ); int len = sizeof( mClient ); SOCKET t = accept( mSockI, (struct sockaddr*)&mClient, &len ); if( t == INVALID_SOCKET ) fprintf_s( fp, "Accept失敗\n" ); mSockYou = t; fprintf_s( fp, "Accept終了\n" ); fclose( fp ); } void CNetwork::Connect(){ FILE* fp; fopen_s( &fp, "messageLog.txt", "a" ); fprintf_s( fp, "Connect開始\n" ); //ソケットの設定 mServer.sin_family = AF_INET; mServer.sin_port = htons( mPort ); mServer.sin_addr.S_un.S_addr = inet_addr( mName ); if (mServer.sin_addr.S_un.S_addr == 0xffffffff) { fprintf_s( fp, "hostbynameへ\n" ); struct hostent *host; host = gethostbyname( mName ); if ( host == NULL ) { return false; } mServer.sin_addr.S_un.S_addr = *(unsigned int *)host->h_addr_list[0]; } fprintf_s( fp, "Socketの設定完了\n" ); while( true ){ fprintf_s( fp, "connect()開始\n" ); if( connect( mSockI, (struct sockaddr *)&mServer, sizeof( mServer ) ) == 0 ){ fprintf_s( fp, "Connect完了\n" ); break; } else{ fprintf_s( fp, "Connect失敗\n" ); Sleep(100); } } fprintf_s( fp, "Connect終了\n" ); fclose(fp); } また、ログは下のように出ました。 //サーバ側 Accept失敗 //クライアント側 Connect開始 Socketの設定完了 connect()開始 Connect失敗 ご教授お願いします。

  • c言語のチャットプログラムのsendとrecv

    現在、複数のクライアントからサーバーにメッセージを送りサーバーからクライアントにメッセージを送るというものを作成しているのですが、クライアントからサーバーにはメッセージを送れるのですが、サーバー側からクライアント1人にしか送れず、クライアント全員にメッセージを送信できませんので、よろしければアドバイスをお願いします サーバーのプログラム インクルード省略 #define BUF_LEN 256 typedef struct CLIENT_INFO { char hostname[BUF_LEN]; char ipaddr[BUF_LEN]; int port; time_t last_access; } CLIENT_INFO; CLIENT_INFO client_info[FD_SETSIZE]; int listening_socket; struct sockaddr_in sn; int accept_new_client(int sock){ int len; int new_socket; struct hostent *peer_host; struct sockaddr_in peer_sin; len = sizeof(sn); new_socket = accept(listening_socket, (struct sockaddr *)&sn, &len); if ( new_socket == -1 ){ perror("accept"); exit(1); } if ( new_socket > FD_SETSIZE-1 ){ return -1; } len = sizeof(peer_sin); getpeername(new_socket, (struct sockaddr *)&peer_sin, &len); peer_host = gethostbyaddr((char *)&peer_sin.sin_addr.s_addr, sizeof(peer_sin.sin_addr), AF_INET); strncpy(client_info[new_socket].hostname, peer_host->h_name, sizeof client_info[new_socket].hostname); strncpy(client_info[new_socket].ipaddr, inet_ntoa(peer_sin.sin_addr), sizeof client_info[new_socket].ipaddr); client_info[new_socket].port = ntohs(peer_sin.sin_port); time(&client_info[new_socket].last_access); printf("接続: %s (%s) ポート %d ディスクリプタ %d 番\n", client_info[new_socket].hostname, client_info[new_socket].ipaddr, client_info[new_socket].port, new_socket); return new_socket; } int read_and_reply(int sock){ int read_size; char buf[BUF_LEN]; read_size = read(sock, buf, sizeof(buf)-1); if ( read_size == 0 || read_size == -1 ){ printf("%s (%s) ポート %d ディスクリプタ %d 番からの接続が切れました。\n", client_info[sock].hostname, client_info[sock].ipaddr, client_info[sock].port, sock); close(sock); client_info[sock].last_access = 0; } else { buf[read_size] = '\0'; printf("%s (%s) ポート %d ディスクリプタ %d 番からのメッセージ: %s", client_info[sock].hostname, client_info[sock].ipaddr, client_info[sock].port, sock, buf); write(sock, buf, strlen(buf)); time(&client_info[sock].last_access); } return read_size; } int main(){ fd_set target_fds; fd_set org_target_fds; int sock_optval = 1; int port = 5000;    listening_socket = socket(AF_INET, SOCK_STREAM, 0); if ( setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR, &sock_optval, sizeof(sock_optval)) == -1 ){ perror("setsockopt"); exit(1); }  sn.sin_family = AF_INET; sn.sin_port = htons(port); sn.sin_addr.s_addr = htonl(INADDR_ANY); if ( bind(listening_socket, (struct sockaddr *)&sn, sizeof(sn)) < 0 ){ perror("bind"); exit(1); }   if ( listen(listening_socket, SOMAXCONN) == -1 ){ perror("listen"); exit(1); printf("ポート %d を見張ります。\n", port);   FD_ZERO(&org_target_fds); FD_SET(listening_socket, &org_target_fds);   while (1){ int i; time_t now_time; struct timeval waitval; waitval.tv_sec = 2; waitval.tv_usec = 500;  memcpy(&target_fds, &org_target_fds, sizeof(org_target_fds));  select(FD_SETSIZE, &target_fds, NULL, NULL, &waitval);  for ( i=0 ; i<FD_SETSIZE ; i++ ) { if ( FD_ISSET(i, &target_fds) ) { printf("ディスクリプタ %d 番が読み込み可能です。\n", i); if ( i == listening_socket ) { int new_sock; new_sock = accept_new_client(i); if ( new_sock != -1 ) { FD_SET(new_sock, &org_target_fds); } } else {int read_size;  read_size = read_size; read_size = read_and_reply(i); if ( read_size == -1 || read_size == 0 ) { FD_CLR(i, &org_target_fds); } } } } time(&now_time); for ( i=0 ; i<FD_SETSIZE ; i++){ if ( ! FD_ISSET(i, &org_target_fds) ) continue; if ( i == listening_socket ) continue; if ( now_time-60 > client_info[i].last_access ) { close(i); FD_CLR(i, &org_target_fds); } } } close(listening_socket); FD_CLR(i, &org_target_fds); } }

  • C言語ソケットでWikipediaの情報入手

    以下のCコードで > gcc wiki_client.c -o wiki_client > ./wiki_client "O'Reilly_Media" として https://en.wikipedia.org/wiki/O%27Reilly_Media の情報を得ようとしているのですが、 HTTP/1.1 400 Bad Request が返ってきます。 これは本に載っていたままのコードなのですが、 どこをどう直せばいいのか分かりません。 どこを直せばいいか教えて下さい。 ブラウザからはもちろんアクセスできます。 環境はUbuntu 18.04のgcc 7.3.0です。 ではよろしくお願いします。 // wiki_client.c #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> void error(char *msg) { fprintf(stderr, "%s: %s\n", msg, strerror(errno)); exit(1); } int open_socket(char *host, char *port) { struct addrinfo *res; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo(host, port, &hints, &res) == -1) error("Can't resolve the address"); int d_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (d_sock == -1) error("Can't open socket"); int c = connect(d_sock, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (c == -1) error("Can't connect to socket"); return d_sock; } int say(int socket, char *s) { int result = send(socket, s, strlen(s), 0); if (result == -1) fprintf(stderr, "%s: %s\n", "Error talking to the server", strerror(errno)); return result; } int main(int argc, char *argv[]) { int d_sock; d_sock = open_socket("en.wikipedia.org", "80"); char buf[255]; sprintf(buf, "GET /wiki/%s http/1.1\r\n", argv[1]); say(d_sock, buf); say(d_sock, "Host: en.wikipedia.org\r\n\r\n"); char rec[256]; int bytesRcvd = recv(d_sock, rec, 255, 0); while (bytesRcvd) { if (bytesRcvd == -1) error("Can't read from server"); rec[bytesRcvd] = '\0'; printf("%s", rec); bytesRcvd = recv(d_sock, rec, 255, 0); } close(d_sock); return 0; }

  • 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; }

  • winsockと、gmail。

    現在、 http://kumei.ne.jp/c_lang/sdk3/sdk_229.htm を参考にして、gmailに向けてメールを送信する プログラムを書いております。 が、メールを送信する前のconnectの部分で失敗してしまいます。 ソースは以下の通りです。 void main() { WSADATA wsaData; LPHOSTENT lpHost; LPSERVENT lpServ; SOCKET s; int iProtocolPort, iRtn; SOCKADDR_IN sockadd; const char*szServerName = "smtp.gmail.com"; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { MessageBox(NULL, "エラーです", "Error", MB_OK); return; } lpHost = gethostbyname(szServerName); if (lpHost == NULL) { MessageBox(NULL, "サーバが見つかりません", "Error", MB_OK); return; } s = socket(PF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { MessageBox(NULL, "ソケットをオープンできません", "Error", MB_OK); return; } lpServ = getservbyname("mail", NULL); if (lpServ == NULL) { MessageBox(NULL, "ポート指定がされていないので、デフォルトを使います", "OK", MB_OK); iProtocolPort = htons(IPPORT_SMTP); } else { iProtocolPort = lpServ->s_port; } sockadd.sin_family = AF_INET; sockadd.sin_port = iProtocolPort; sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd))) { /*ここでWSAGetLastError()をすると、WSAETIMEDOUTが返ってきます。*/ MessageBox(NULL, "サーバーソケットに接続失敗", "Error", MB_OK); return; } /*以下続く*/ } 上にあるように、connectの部分でタイムアウトになるようです。 当方、これらに関する周辺知識が足りておらず、 一体どこが間違えているのかすらわかりません。 どなたかこれが上手くいかない原因がわかる方、 是非、ご教授お願いします。

専門家に質問してみよう