使用 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