使用 c/c++(套接字)连接到 gmail smtp 服务器
Connecting to gmail smtp server using c/c++ (sockets)
我正在尝试使用纯套接字连接到 google smtp 服务器(“smtp.gmail.com”)。
我创建了一个套接字,当我读取数据时连接只给我“54”或“52”或“53”或“54”。
sockaddr_in service;
WSADATA wsaData;
struct hostent* remoteHost;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != NO_ERROR) {
std::cout << 1;
return EXIT_FAILURE;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
WSACleanup;
return EXIT_FAILURE;
}
remoteHost = gethostbyname(SMTP_HOST);
memset(&service, 0, sizeof(service));
service.sin_family = AF_INET;
service.sin_addr.s_addr = *(u_long*)remoteHost->h_addr_list[0];
service.sin_port = htons(25);
if (connect(sock, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
WSACleanup;
return EXIT_FAILURE;
}
char senddata[] = "STARTTLS";
read_socket();
send(sock, EHLO, strlen(EHLO), 0);
read_socket();
send(sock, senddata, strlen(senddata), 0);
std::cout << 0;
return EXIT_SUCCESS;
我的read_socket函数
void read_socket() {
int bytesRecv = recv(sock, recvbuf, BUFSIZ, 0);
if (bytesRecv == 0 || bytesRecv == WSAECONNRESET) {
std::cout << "Connection closed"<<std::endl;
return;
}
std::cout << bytesRecv << std::endl;
}
编辑:添加 read_socket 功能。
显然第一个 recv()
只返回第一行响应。
250-smtp.gmail.com at your service, [1.2.3.4]
(地址不同)
你有两个选择。在阅读之前等待一段时间,以便获得所有响应,或者循环读取(更好的主意),直到收到来自 SMTP 服务器的所有响应。
recv
将缓冲区和 return 接收到的字节数作为参数,代码中的 bytesRecv
是接收到的字节数(54 字节)而不是字节数,以找到 google 回答你需要显示的内容 recvbuf
std::cout << recvbuf << std::endl;
我正在尝试使用纯套接字连接到 google smtp 服务器(“smtp.gmail.com”)。 我创建了一个套接字,当我读取数据时连接只给我“54”或“52”或“53”或“54”。
sockaddr_in service;
WSADATA wsaData;
struct hostent* remoteHost;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != NO_ERROR) {
std::cout << 1;
return EXIT_FAILURE;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
WSACleanup;
return EXIT_FAILURE;
}
remoteHost = gethostbyname(SMTP_HOST);
memset(&service, 0, sizeof(service));
service.sin_family = AF_INET;
service.sin_addr.s_addr = *(u_long*)remoteHost->h_addr_list[0];
service.sin_port = htons(25);
if (connect(sock, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
WSACleanup;
return EXIT_FAILURE;
}
char senddata[] = "STARTTLS";
read_socket();
send(sock, EHLO, strlen(EHLO), 0);
read_socket();
send(sock, senddata, strlen(senddata), 0);
std::cout << 0;
return EXIT_SUCCESS;
我的read_socket函数
void read_socket() {
int bytesRecv = recv(sock, recvbuf, BUFSIZ, 0);
if (bytesRecv == 0 || bytesRecv == WSAECONNRESET) {
std::cout << "Connection closed"<<std::endl;
return;
}
std::cout << bytesRecv << std::endl;
}
编辑:添加 read_socket 功能。
显然第一个 recv()
只返回第一行响应。
250-smtp.gmail.com at your service, [1.2.3.4]
(地址不同)
你有两个选择。在阅读之前等待一段时间,以便获得所有响应,或者循环读取(更好的主意),直到收到来自 SMTP 服务器的所有响应。
recv
将缓冲区和 return 接收到的字节数作为参数,代码中的 bytesRecv
是接收到的字节数(54 字节)而不是字节数,以找到 google 回答你需要显示的内容 recvbuf
std::cout << recvbuf << std::endl;