使用 send() 在 C 中与 SMTP 服务器通信
Talking to SMTP Server in C with send()
我正在编写交互式 SMTP 客户端,它可以通过终端与 SMTP 服务器通信。到目前为止,我已经建立了一个连接(首先 recv()
之后服务器响应 220),然后尝试向服务器发送一个 HELO
。发送函数给我一个 return 值 15,所以它应该可以工作。但是后来我尝试读取响应(应该是 250 OK
),但是程序阻塞并且 return 什么也没有。我正在使用假的 SMTP 作为测试服务器。
到目前为止,这是我的代码:
char IPADDRESS []= "127.0.0.1";
int initConnect(){
int sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,NULL, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_port = htons(25);
serv_addr.sin_family = AF_INET;
if(inet_pton(AF_INET, IPADDRESS, &serv_addr.sin_addr) > 0){
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
}else{
return -1;
}
return sock;
}
int main(void){
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int FLAGS = 0;
int fd;
fd = initConnect();
if(fd == -1){
printf("Error occured while connecting to the Server");
exit(1);
} else {
printf(" -> Connected\n");
}
// get response from Server after connection
int recBytes = recv(fd, buffer, sizeof(buffer), FLAGS);
printf("Server: %s", buffer);
// send HELO cmd to Sever (if < 0 error)
int ret = send(fd, "HELO 127.0.0.1\n", strlen("HELO 127.0.0.1\n"), FLAGS);
printf("\nSend bytes: %i\n", ret);
// get response from Server after HELO (program blocks here)
memset(buffer, 0, sizeof(buffer));
recBytes = recv(fd, buffer, sizeof(buffer), FLAGS);
printf("\nServer: %s", buffer);
}
SMTP RFC 说:
Lines consist of zero or more data characters terminated by the
sequence ASCII character "CR" (hex value 0D) followed immediately by
ASCII character "LF" (hex value 0A).
您的代码仅发送 <LF>
(\n
),因此需要更改为 \r\n
。
我正在编写交互式 SMTP 客户端,它可以通过终端与 SMTP 服务器通信。到目前为止,我已经建立了一个连接(首先 recv()
之后服务器响应 220),然后尝试向服务器发送一个 HELO
。发送函数给我一个 return 值 15,所以它应该可以工作。但是后来我尝试读取响应(应该是 250 OK
),但是程序阻塞并且 return 什么也没有。我正在使用假的 SMTP 作为测试服务器。
到目前为止,这是我的代码:
char IPADDRESS []= "127.0.0.1";
int initConnect(){
int sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,NULL, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_port = htons(25);
serv_addr.sin_family = AF_INET;
if(inet_pton(AF_INET, IPADDRESS, &serv_addr.sin_addr) > 0){
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
}else{
return -1;
}
return sock;
}
int main(void){
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int FLAGS = 0;
int fd;
fd = initConnect();
if(fd == -1){
printf("Error occured while connecting to the Server");
exit(1);
} else {
printf(" -> Connected\n");
}
// get response from Server after connection
int recBytes = recv(fd, buffer, sizeof(buffer), FLAGS);
printf("Server: %s", buffer);
// send HELO cmd to Sever (if < 0 error)
int ret = send(fd, "HELO 127.0.0.1\n", strlen("HELO 127.0.0.1\n"), FLAGS);
printf("\nSend bytes: %i\n", ret);
// get response from Server after HELO (program blocks here)
memset(buffer, 0, sizeof(buffer));
recBytes = recv(fd, buffer, sizeof(buffer), FLAGS);
printf("\nServer: %s", buffer);
}
SMTP RFC 说:
Lines consist of zero or more data characters terminated by the sequence ASCII character "CR" (hex value 0D) followed immediately by ASCII character "LF" (hex value 0A).
您的代码仅发送 <LF>
(\n
),因此需要更改为 \r\n
。