使用send()与C中的SMTP服务器对话
我正在编写一个交互式SMTP客户端,它可以通过终端与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 =
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))代码>