• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SSL_connect(ssl))

SSL_connect(ssl)でGメールからメールを受信する方法

このQ&Aのポイント
  • GメールからPOP3S接続でメールを受け取る方法について紹介します。
  • 接続の部分に問題がある場合、アドバイスを求めています。
  • SSL_connect(ssl)を使用して、GメールのPOP3サーバーに接続し、メールを受信することができます。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

RETRコマンドで読み取り完了したら、そのメールを削除して、QUITコマンドで切断していますから1通しか読み込めないのは想定内の動作のハズですけど、そこらヘンはどうなんですかね? CSQMailBoxTreeView::GmailProcessData()の呼び出し方次第ではココも正常動作が期待できませんが…。 前回の回答でも指摘しましたが普通のPOP3で正しく動作するもの作ってからの方がいいと思われますが…。 その際、LAN内の別マシンにPOP3サーバを構築すればWireSharkなどでパケットの内容は確認できますし。 # GmailのPOP3って…bad commandで切断されるのね…… あと…MessageBox()でもろもろの通知を出すと「そこで処理が止まる」ので通信扱う場合だと問題が発生することもありますのでご注意を。 # 私ならTRACE()やその類使いますね。(Win32SDKなんでOutputDebugString()ですが…)

uyama33
質問者

補足

関連する残りの部分です。 POP3 では、メールは取り出せます。 新しく、POP3S で接続しようとしています。 ご指摘の部分を参考に、デバッグを続けます。 ありがとうございました。 // MailAsync(); corresponding to the message SM_GASYNC3. LRESULT CSQMailBoxTreeView::GmailMailAsync(WPARAM , LPARAM lParam) { int GmailnBytesRead; char buf1[256]; int nEvent = (int)WSAGETSELECTEVENT(lParam); int nError = (int)WSAGETSELECTERROR(lParam); sprintf_s(buf1,"hasm %d error\r\n",nError); if( nError ){ MessageBox(buf1,"Error", MB_OK); } switch(nEvent){ case FD_CONNECT: break; case FD_WRITE: break; case FD_READ: // Receive waiting data GmailnBytesRead = SSL_read( ssl, // socket gbufRecv, // buffer sizeof(gbufRecv)-1 // max len to read //はみだしそう -1 付けた ); // recv flags // Check recv() return code if (GmailnBytesRead == 0){ // Connection has been closed. int erv = SSL_get_error(ssl, GmailnBytesRead); if(erv <= 0){ MessageBox("Connection closed unexpectedly", "recv() error", MB_OK); } break; } if (GmailnBytesRead < 0){ int erv = SSL_get_error(ssl, GmailnBytesRead); if(erv <= 0){ wsprintf((LPSTR)gszTemp, (LPSTR)"recv() error: %d", GmailnBytesRead); MessageBox( gszTemp,"recv() error",MB_OK); gszTemp[0] = '\0'; } break; } // Null terminate the buffer gbufRecv[GmailnBytesRead] = '\0'; //はみだしそう // And pass it to be interpreted GmailProcessData(gbufRecv, GmailnBytesRead); break; case FD_CLOSE: break; } fRet = TRUE; return 0; } LPSTR CSQMailBoxTreeView::GmailDecodeError(int ErrorCode) { static char Message[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)Message, 1024, NULL); return Message; } void CSQMailBoxTreeView::GmailMailDL2(){ reached = download = 0; in_header = 1; ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetWindowText("メール受信中です、しばらくお待ちください。"); GmailMailDL(); ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetWindowText("終了。"); }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>メールヘッダーの受信後に、本文を取り出す前に接続が切れます。 POP3Sで接続して、RETRコマンドの発行まで出来ているんでしょう? であれば、接続の時のコードを掲示してもあまり意味が無いと思いますが。 # SSL接続の方法などについて意味があるかも知れませんけど、ログイン出来ているならSSL接続は出来ていることになりませんか? 実際のデータ受信処理の辺りがどうなっているのか? が問題かと思いますが……。 LISTコマンドやTOPコマンド、RETRコマンドは1行受信して終了ではなく、 "."のみの行を受信するまで続きますがそこらヘン正しく処理していますか? # "\r\n.\r\n"が正確なとこですかねぇ。 POP3Sが~ではなく通常のPOP3でちゃんと処理できるかどうかを先にやってはどうですか? 自由に使えるメールサーバがあれば、こういう時は楽…なんですけどね。 実行しているWindowsに一時的にメールサーバ構築する。なんてのもアリでしょう。 「Windows メールサーバ」辺りで検索すると情報も見つかるでしょう。 # 私はMercury辺りを使ったことがありますが。 # 今はLAN内のメールサーバ(Linux+Dovecot)があるので使っていませんけど。

uyama33
質問者

お礼

続きです。(一部重複)接続できていて不安定ですが一度だけメール本文も取得できました。 case STATE_LIST: sscanf(lpStr, "%s %ld %ld", gszTemp, &lCount, &lSize); _itoa(lSize, c_strSize,10); wsprintf(gszTemp, "RETR %d\r\n",download); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_RETR; break; case STATE_RETR: if((lpStr[0]=='.') && (strlen(lpStr)==2)){ pDoc->D_hi.DoIt(pDoc->Mailstrs); strcpy_s(c_strTo, pDoc->D_hi.GetTo()); strcpy_s(c_strSubject, pDoc->D_hi.GetSubject()); strcpy_s(c_strFrom, pDoc->D_hi.GetFrom()); strcpy_s(c_strAttach, ""); // strcpy(c_strSize, ""); strcpy_s(c_strPriority, "2"); strcpy_s(c_strRead, "1");//未読1 , 既読0 if(mailfilter == 1){ ret = pDoc->GetPrgbyAddr(c_strFrom); if(ret == 0){ strcpy_s(c_strState, "3");//1:受信箱 2:送信済み 3:迷惑メール 4:ゴミ箱 }else{ strcpy_s(c_strState, "1");//1:受信箱 2:送信済み 3:迷惑メール 4:ゴミ箱 } }else{ strcpy_s(c_strState, "1");//1:受信箱 2:送信済み 3:迷惑メール 4:ゴミ箱 } strcpy_s(c_strDate, pDoc->D_hi.GetDate()); if(CFile::GetStatus("test2.bin", fs) == TRUE){CFile::Remove("test2.bin");} u_CStringArray2File("test2.bin", pDoc->Mailstrs); pDoc->AddNewMail("test2.bin"); pDoc->Mailstrs.RemoveAll(); // Send the QUIT command. And set the app state. if(0 == atoi(oc_Gmailradio)){ wsprintf(gszTemp, "DELE %d\r\n",download); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags } wsprintf(gszTemp, "QUIT\r\n"); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_QUIT; } else{// by uyama sbuf = lpStr; sbuf += "\n"; pDoc->Mailstrs.Add(sbuf);//lpSt + "\n"; } break; case STATE_QUIT: SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); ERR_free_strings(); CloseSocket(sock); if((state == -STATE_LIST ) || (state == -STATE_RETR)){ }else{ pDoc->m_pTreeView->nImageID = 1; if(reached == download){ pDoc->m_pListView->ShowReceived(); } if(reached>download){ in_header = 1; pDoc->Mailstrs.RemoveAll(); ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetWindowText("メール受信中です、しばらくお待ちください。"); GmailMailDL(); ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetWindowText("終了。"); } } } } void CSQMailBoxTreeView::GmailProcessData(LPSTR lpBuf, int nBytesRead) { static char szResponse[4096]; static int nLen = 0; char *cp; // Is there enough room in our buffer for the new data? if ((nLen + nBytesRead) > sizeof(szResponse)){ MessageBox("Buffer overrun, data truncated","Error",MB_OK); nLen = 0; szResponse[0] = '\0'; return; } // Append the new data to our buffer strcat_s(szResponse, sizeof(szResponse), lpBuf); nLen = strlen(szResponse); // Process all full lines while(1){ // Does the buffer contain a full line? cp = strchr(szResponse, '\n'); if (cp == NULL) break; // We have a CR/LF pair // Replace the LF with a NULL *cp = '\0'; // And pass it to the ProcesLine() function GmailProcessLine( szResponse); // Move the remaining data to the front // of the buffer cp++; if (strlen(cp)) memmove(szResponse, cp, strlen(cp)+1); else szResponse[0] = '\0'; } }

uyama33
質問者

補足

void CSQMailBoxTreeView::GmailProcessLine(LPSTR lpStr) { int nRet, ret; long lCount; long lSize; CFileStatus fs; CString sbuf; BStringBuffer s(""); CSQMailBoxDoc* pDoc = GetDocument(); if(strlen(lpStr)==1 && in_header){ pDoc->GetHeaderInfor(); in_header = 0; } // Check response for error if ((lpStr[0] == '-') && (lpStr[1] == 'E') && (lpStr[2] == 'R') && (lpStr[3] == 'R')) { // MessageBox("Negative response: ","Error",MB_OK); switch(gnAppState) { case STATE_CONNECTING: MessageBox("Connection denied","Error",MB_OK); break; case STATE_USER: MessageBox("Unknown UserID\r\n","Error",MB_OK); break; case STATE_PASS: MessageBox("Wrong Password","Error",MB_OK); break; case STATE_STAT: MessageBox("STAT command not supported","Error",MB_OK); break; case STATE_LIST: state = -STATE_LIST; MessageBox("メールはありません。"); break; case STATE_RETR: state = -STATE_RETR; MessageBox("Negative RETR response."); break; case STATE_QUIT: MessageBox("QUIT command not supported","Error",MB_OK); break; } wsprintf(gszTemp, "QUIT\r\n"); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_QUIT; SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); ERR_free_strings(); CloseSocket(sock); return; } // We have a positive response switch(gnAppState) { case STATE_CONNECTING: // Send the USER portion of the login request and set the app state wsprintf(gszTemp, "USER %s\r\n", gszGmailUserId); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_USER; break; case STATE_USER: // Send the PASSword portion of the login request and set the app state wsprintf(gszTemp, "PASS %s\r\n", gszGmailPassword); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_PASS; break; case STATE_PASS: // Send the STAT command request and set the app state wsprintf(gszTemp, "STAT\r\n"); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flagsgs gnAppState = STATE_STAT; break; case STATE_STAT: // Read the STAT response and print the results sscanf(lpStr, "%s %ld %ld", gszTemp, &lCount, &lSize); if(download == 0){reached = lCount;} download += 1; wsprintf(gszTemp, "LIST %d\r\n",download); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_LIST; break; case STATE_LIST: sscanf(lpStr, "%s %ld %ld", gszTemp, &lCount, &lSize); _itoa(lSize, c_strSize,10); wsprintf(gszTemp, "RETR %d\r\n",download); nRet = SSL_write(ssl, // socket gszTemp, // data buffer strlen(gszTemp) // length of data ); // send flags gnAppState = STATE_RETR; break;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Winsockプログラムの初歩的質問(connect()がうまくいかない)

    ソケットの練習をしています。とりあえずconnect()で通信経路を確立するところまでを書いたつもりですが、以下プログラムを実行すると「サーバーソケットに接続失敗」となります。 とりあえずprintf()でチェックしたところsocket()まではうまくいっているようです。 環境:Win2000 , VC++6.0 , LAN接続でDHCP→学内サーバー です。 よろしくお願いします。 #include<winsock2.h> #include<stdio.h> int main() { WSADATA wsaData; struct hostent *host; SOCKET sock1; SOCKADDR_IN name; WSAStartup(2 , &wsaData); host=gethostbyname("www.goo.ne.jp"); //gooのIPアドレスを取得 sock1 = socket(AF_INET,SOCK_STREAM,0); //ソケット生成 /**ここからがあやしい**/ name.sin_port=htons(80); name.sin_addr=*((in_addr *)*host->h_addr_list); if(connect(sock1,(PSOCKADDR)&name,sizeof(name))){ printf("サーバーソケットに接続失敗\n"); return 0; } WSACleanup(); return(0); }

  • 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と、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の部分でタイムアウトになるようです。 当方、これらに関する周辺知識が足りておらず、 一体どこが間違えているのかすらわかりません。 どなたかこれが上手くいかない原因がわかる方、 是非、ご教授お願いします。

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • 外部シンボルって

    本に載っていた以下のようなサンプルコード #include <stdio.h> #include <winsock.h> void main( void ) { WSADATA wsadata; if ( WSAStartup( 0x0101, &wsadata ) != 0 ) { printf( "WSAStartup の実行に失敗 %d\n", WSAGetLastError()); } int sock; struct sockaddr_in addr; int ret ; struct hostent *hostinfo; unsigned long inetaddress; char *hostname = "localhost"; inetaddress = inet_addr( hostname ); if ( inetaddress == INADDR_NONE ) { hostinfo = gethostbyname( hostname ); if ( hostinfo == 0 ) { // ホスト名解決に失敗 return ; } inetaddress = *(unsigned long *)hostinfo->h_addr_list[0]; } addr.sin_family = AF_INET; addr.sin_addr.s_addr = inetaddress; addr.sin_port = htons(80); sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); ret = connect( sock, (struct sockaddr *)&addr, sizeof addr ); if ( ret < 0 ) { printf( "localhost 80 に接続できなかった" ); return ; } char get[] = "GET /index.html HTTP/1.0\r\n\r\n"; send( sock, get, strlen(get), 0 ); char buf[256]; int n; printf( "recv data\n" ); while ( 1 ) { n = recv( sock, buf, sizeof(buf)-1, 0 ); if ( n <= 0 ) break; buf[ n ] = '\0'; printf( buf ); } closesocket( sock ); WSACleanup(); } をVC++6.0でコンパイルしたのですが sample_client_win.obj : error LNK2001: 外部シンボル "_WSACleanup@0" は未解決です のようなコンパイルエラーが出て実行できません。これはなにが悪いのでしょうか。本に載っているサンプルコードなのでソース自体は間違っていないと思うのですが・・・もしよろしかったらご教授ください。

  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • 実行ファイルのweb掲載可否

    以下のプログラムの実行ファイルをweb上に載せることはできるのでしょうか? #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • UDPデータ受信について

    以下でデータを送信すると、直ぐに0x42,0x42,0x00,0x00,0x00,0x00,0x82,0x00,0x01,0x44,0x33,0x00の12バイトのデータを送り返してくるのですが、これを送り返してきたら、数字の1を表示するように以下のプログラム内に書き込むことは出来ませんでしょうか?ご教授お願いします。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。