【发布时间】:2020-11-17 09:44:41
【问题描述】:
我正在尝试使用纯套接字连接到 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 函数。
【问题讨论】:
-
您的代码看起来不错,您的 read_socket 功能代码在哪里?
-
你用
EHLO发送什么? -
而
BUFSIZ是? -
@phoenixstudio 已编辑。我将 EHLO 定义为“EHLO localhost” BUFFSIZ 是来自 sdio.h 的宏及其 int 512
-
您返回的 52-54 是
std::cout << bytesRecv << std::endl;的输出吗?因为第一个响应行的长度大约是这个长度,具体取决于您的公共 IP 地址。