网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 23 struct sockaddr_in server;
- 24 struct hostent *hp;
- 25 };
- 26
- 27 #endif
sock.cpp文件
- 1 #include “sock.h”
- 2 #include
- 3 #include <netdb.h>
- 4 #include <string.h>
- 5 #include <sys/types.h>
- 6
- 7 Sock::Sock()
- 8 {
- 9 sock = socket(AF_INET, SOCK_STREAM, 0);
- 10 if(sock == -1)
- 11 {
- 12 throw std::runtime_error(“socket init error\n”);
- 13 }
- 14 }
- 15 Sock::~Sock()
- 16 {
- 17 close(sock);
- 18 }
- 19 bool Sock::Connect(const char *host_id, const int &port)
- 20 {
- 21 server.sin_family = AF_INET;
- 22 hp = gethostbyname(host_id);
- 23 if(hp == (struct hostent *) 0)
- 24 {
- 25 std::cerr << “服务器地址获取失败!” << std::endl;
- 26 return false;
- 27 }
- 28 memcpy((char *)&server.sin_addr,
- 29 (char *)hp->h_addr, hp->h_length);
- 30 server.sin_port = htons(port);
- 31 if(connect(sock, (sockaddr *) &server, sizeof server) == -1)
- 32 {
- 33 std::cerr << “连接服务器失败!” << std::endl;
- 34 return false;
- 35 }
- 36 else
- 37 return true;
- 38 }
- void Sock::send_socket(const char *s)
- 40 {
- 41 send(sock, s, strlen(s), 0);
- 42 }
- 43 int Sock::recv_socket()
- 44 {
- 45 memset(recvbuf, 0,BUFSIZ);
- 46 return recv(sock, recvbuf, BUFSIZ, 0);
- 47 }
- 48 const char * Sock::get_recvbuf()
- 49 {
- 50 return recvbuf;
- 51 }
下面是用SMTP协议发送邮件,格式就如代码所示。了解下SMTP协议,依葫芦画瓢了。
- 1 #include “sock.h”
- 2 #include
- 3
- 4 int main()
- 5 {
- 6 Sock sock;
- 7 const char *host_id = “smtp.126.com”;
- 8 int port = 25;//smtp协议专用端口
- 9 char wkstr[100] = “hello,how are you?”;//邮件内容
- 10 if(sock.Connect(host_id, port) == false)
- 11 return 1;
- 12 sock.recv_socket();
- 13 std::cout << “Client : connected! \nServer :”
- 14 << sock.get_recvbuf() << std::endl;
- 15
- 16 /* EHLO指令是必须首先发的,相当于和服务器说hello */
- 17 sock.send_socket(“EHLO **********\r\n”);//邮箱用户名
- 18 sock.recv_socket();
- 19 std::cout << “Client : send helo \nServer :”
- 20 << sock.get_recvbuf() << std::endl;
- 21
- 22 /*发送 auth login 指令,告诉服务器要登录邮箱*/
- 23 sock.send_socket(“auth login\r\n”);
- 24 sock.recv_socket();
- 25 std::cout << “Client : send auth login \nServer :”
- 26 << sock.get_recvbuf() << std::endl;
- 27
- 28 /*告诉服务器要登录后,接着就是把用户名发过去了.
- 29 不过这个用户名是经过了base64编码的,smtp也支持
- 30 明文传送,至于具体有什么区别上网上找资料看看就知道了*/
- 31 sock.send_socket(“**********”);//经过base64编码后的邮箱用户名
- 32 sock.send_socket(“\r\n”);
- 33 sock.recv_socket();
- 34 std::cout << “Client : send name \nServer :”
- 35 << sock.get_recvbuf() << std::endl;
- 37 /* 用户名发过去后接着就是用户密码了,当然也是经过base64编码后的*/
- 38 sock.send_socket(“base64编码后的密码”);
- 39 sock.send_socket(“\r\n”);
- 40 sock.recv_socket();
- 41 std::cout << “Client : send password \nServer :”
- 42 << sock.get_recvbuf() << std::endl;
- 43
- 44 /*发送 mail from 指令,相当于填写发件人*/
- 45 sock.send_socket(“mail from: <”);
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dn.net/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!