ありがとうございます。
sprintf_sに関しては...お恥ずかしい。
sprintf_sに第二引数があること自体初めて知りました...
ところで、smtp-relay.gmail.comに587番ポートで接続したところ、応答が帰ってきました。
OKこそ帰ってきていませんが、250はOKと同義?なようで。
しかし、以下のように出力されてからずっと止まったままです。
どうやら、エラーではないもののrecvでずっと固まっているみたいです。
どうなっているんでしょうか?
コード:
--------------出力結果-------------
WinSock初期化成功
ソケット作成成功
ホストアドレス取得成功
サーバとの接続を確立
Request > HELO smtp-relay.gmail.com
サーバーにリクエスト開始...
応答を受信中...
220 smtp-relay.gmail.com ESMTP a64sm675020ywa.7 - gsmtp
250 smtp-relay.gmail.com at your service
コード:
#include <iostream>
#include <string>
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#define WIN32_LEAN_AND_MEAN
char ServerName[] = "smtp-relay.gmail.com"; // 接続先のホスト名
unsigned short Port = 587; //smtpポート
using namespace std;
#define BUFSIZE 2600 // バッファサイズ
#define RECVSIZE 65536 // 受信バッファサイズ
int main() {
// WinSock初期化
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
int nErrorStatus;
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (atexit((void(*)(void))(WSACleanup))) {
printf("atexit(WSACleanup)失敗\n");
return -1;
}
if (nErrorStatus != 0) {
printf("初期化失敗です\n");
return -1;
}
cout << "WinSock初期化成功" << endl;
// ソケット作成
int soc; // ソケット
soc = socket(AF_INET, SOCK_STREAM, 0);
if (soc == INVALID_SOCKET) {
printf("ソケット作成失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
return -1;
}
cout << "ソケット作成成功" << endl;
// サーバのIPアドレス取得
PHOSTENT phostent;
unsigned long ulIPAddress; // サーバのIPアドレス格納変数
ulIPAddress = inet_addr(ServerName); // IPアドレス取得
// inet_addr()関数が失敗したら
if (ulIPAddress == -1) {
if ((phostent = gethostbyname(ServerName)) != NULL) {
ulIPAddress = *((unsigned long *)(phostent->h_addr));
}
else {
printf("ホストアドレス取得失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
}
cout << "ホストアドレス取得成功" << endl;
// サーバへ接続
SOCKADDR_IN addrServer; // サーバのアドレス
addrServer.sin_family = AF_INET; // アドレスファミリの指定
addrServer.sin_addr.s_addr = ulIPAddress; // サーバのIPアドレスの指定
addrServer.sin_port = htons((unsigned short)Port); // ポート番号の指定
if (connect(soc, (LPSOCKADDR)&addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
printf("サーバへの接続失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
cout << "サーバとの接続を確立" << endl;
// リクエストを送信
for (;;) {
string Rec;
cout << "Request > "; getline(cin, Rec);
char request[BUFSIZE];
cout << "\nサーバーにリクエスト開始... (" << Rec << ")" << endl;
sprintf_s(request, BUFSIZE, "%s\r\n", Rec.c_str());
if (send(soc, request, sizeof(request), 0) == SOCKET_ERROR) {
printf("サーバへの送信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
shutdown(soc, 2);
closesocket(soc);
return -1;
}
// データの受信
char recv_buf[RECVSIZE];
cout << "応答を受信中...\n" << endl;
for (int t = 0; t < 100; t++) {
int nBytesRecv = recv(soc, recv_buf, sizeof(recv_buf), 0); //ここで止まったまま
if (nBytesRecv == SOCKET_ERROR) {
printf("サーバからの受信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
break;
}
if (nBytesRecv == 0)break;
recv_buf[nBytesRecv] = '\0'; // 受信バッファの後ろにNULLを付加する
printf("%s", recv_buf); // 受信した内容を表示
}
}
shutdown(soc, 2);
closesocket(soc);
return 0;
}