使用send()与C中的SMTP服务器对话

使用send()与C中的SMTP服务器对话,c,sockets,smtp,C,Sockets,Smtp,我正在编写一个交互式SMTP客户端,它可以通过终端与SMTP服务器进行通信。到目前为止,我已经建立了一个连接(首先是recv()),然后尝试向服务器发送HELO。send函数给我一个15的返回值,所以应该可以正常工作。但是我尝试读取响应(应该是250ok),但是程序阻塞并且什么也不返回。我正在使用假的SMTP作为测试服务器 以下是我目前的代码: char IPADDRESS []= "127.0.0.1"; int initConnect(){ int sock =

我正在编写一个交互式SMTP客户端,它可以通过终端与SMTP服务器进行通信。到目前为止,我已经建立了一个连接(首先是
recv()
),然后尝试向服务器发送
HELO
。send函数给我一个15的返回值,所以应该可以正常工作。但是我尝试读取响应(应该是
250ok
),但是程序阻塞并且什么也不返回。我正在使用假的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);
}
char-IPADDRESS[]=“127.0.0.1”;
int initConnect(){
intsock=socket(AF_INET,sock_STREAM,0);
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR | SO_REUSEPORT,NULL,0);
服务地址中的结构sockaddr\u;
memset(&serv_addr,'0',sizeof(serv_addr));
serv_addr.sin_port=htons(25);
serv_addr.sin_family=AF_INET;
if(inet\u pton(AF\u inet、IPADDRESS和服务地址sin\u addr)>0){
连接(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
}否则{
返回-1;
}
返回袜子;
}
内部主(空){
字符缓冲区[1024];
memset(buffer,0,sizeof(buffer));
int标志=0;
int-fd;
fd=initConnect();
如果(fd==-1){
printf(“连接到服务器时出错”);
出口(1);
}否则{
printf(“->已连接\n”);
}
//连接后从服务器获取响应
int recBytes=recv(fd,buffer,sizeof(buffer),FLAGS);
printf(“服务器:%s”,缓冲区);
//向服务器发送HELO cmd(如果<0错误)
int ret=发送(fd,“直升机127.0.0.1\n”,strlen(“直升机127.0.0.1\n”),标志);
printf(“\n发送字节:%i\n”,ret);
//HELO后从服务器获取响应(此处为程序块)
memset(buffer,0,sizeof(buffer));
recBytes=recv(fd,buffer,sizeof(buffer),FLAGS);
printf(“\n服务器:%s”,缓冲区);
}
上面写着:

行由零个或多个以 序列ASCII字符“CR”(十六进制值0D),后跟 ASCII字符“LF”(十六进制值0A)


您的代码只发送
\n
),因此需要根据规范更改为
\r\n

,每个SMTP行应以
结尾。您只发送了
。就这样!现在它工作了,谢谢你的旁注,
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR | SO_REUSEPORT,NULL,0)无效。您不能通过一次调用
setsockopt()
这样指定多个套接字选项。这两个选项都接受输入值,而不是传入。您需要分别为每个套接字选项调用
setsockopt()
,例如:
intoptval=1;setsockopt(sock、SOL_SOCKET、SO_REUSEADDR和optval、sizeof(optval));setsockopt(sock、SOL_SOCKET、SO_REUSEPORT和optval、sizeof(optval))