近日调试smtp客户端,遇到一个特殊问题 使用cmail server, 发送DATA命令后,cmail server没有响应,但是有的smtp服务器好用,分析很长时间没有分析明白,后来发现是因为发送的时候,使用的如下语句 write(sock , "DATA/r/n", 100); 这个时候,服务器可能会判断字符串的长度为100,和DATA命令不匹配,导致一些特殊问题,如果指定的长度是字符串的长度,就没有问题了。 这个问题是由于没有良好的编成习惯和牢固的基础知道导致的。需要注意。 过程分析: 开始调试下面的程序,没有问题,然后移植代码,发现对有的服务器好用,有的不好用。这个时候没有仔细的分析自己的代码,确到处找原因,找服务器的原因,环境的原因。最后通过一点点比较程序的差异,修改程序,才发现问题。应该对程序进行仔细检查。过程中过分相信自己的代码。调式方法不正确。基础知识欠缺。希望自己以后不要犯这种错误了。 把一个简单的代码贴出来,分享,也是从网络上找的代码,然后进行修改,没有对错误进行处理,没有认证的过程,适用于类UNIX系统。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> void _exit(int status); #define HELO "HELO/r/n" #define DATA "DATA/r/n" #define QUIT "QUIT/r/n" FILE *fin; int sock; struct sockaddr_in server; struct hostent *hp, *gethostbyname(); char buf[99+1]; int len; char *host_id; char *from_id; char *to_id; char *file_id; char wkstr[100]; char hostname[100]; /*=====Send a string to the socket=====*/ send_socket(char *s) { int ret; ret = write(sock,s,strlen(s)); if (ret < 0) printf("send error :%s/n", strerror(errno)); write(1,s,strlen(s)); } /*=====Read a string from the socket=====*/ read_socket() { len = read(sock,buf,99); write(1,buf,len); } /*=====MAIN=====*/ int main(int argc, char* argv[]) { if(argc != 5) { printf("USAGE: %s <host> <from> <to> <filename>/n/n", argv[0]); return 1; } host_id=argv[1]; from_id=argv[2]; to_id=argv[3]; file_id=argv[4]; /*=====Create Socket=====*/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock==-1) { perror("opening stream socket"); return 1; } /*=====Verify host=====*/ server.sin_family = AF_INET; hp = gethostbyname(host_id); if (hp==(struct hostent *) 0) { fprintf(stderr, "%s: unknown host/n", host_id); return 2; } /*=====Connect to port 25 on remote host=====*/ printf ("hostent %s/n", hp->h_addr_list[0]); memcpy((char *) &server.sin_addr, (char *) hp->h_addr, hp->h_length); server.sin_port=htons(25); /* SMTP PORT */ if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1) { perror("connecting stream socket"); return 1; } /*=====Write some data then read some =====*/ read_socket(); /* SMTP Server logon string */ send_socket(HELO); /* introduce ourselves */ read_socket(); /*Read reply */ send_socket("MAIL from"); /* Mail from us */ send_socket(from_id); send_socket("/r/n"); read_socket(); /* Sender OK */ send_socket("RCPT To: "); /*Mail to*/ send_socket(to_id); send_socket("/r/n"); read_socket(); /*Recipient OK*/ send_socket(DATA);/*body to follow*/ read_socket(); /*ok to send */ fin=fopen(file_id, "r"); /* open file */ while(1) { if(fgets(wkstr, 100, fin)==NULL) break; /* exit on EOF */ send_socket(wkstr); } fclose(fin); /* close file */ send_socket("/r/n./r/n"); read_socket(); /* OK*/ send_socket(QUIT); /* quit */ read_socket(); /* log off */ /*=====Close socket and finish=====*/ close(sock); return 0; }