blob: 3c64add5ae60c67dae5976ddb7007a81dd265b2d [file] [log] [blame]
Parker Schuhb59bf5e2016-12-28 21:09:36 -08001#include "aos/vision/events/tcp_client.h"
2
3#include <arpa/inet.h>
Parker Schuhb59bf5e2016-12-28 21:09:36 -08004#include <fcntl.h>
5#include <netdb.h>
6#include <netinet/in.h>
Stephan Pleinescc500b92024-05-30 10:58:40 -07007#include <strings.h>
Parker Schuhb59bf5e2016-12-28 21:09:36 -08008#include <sys/socket.h>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07009
Tyler Chatowbf0609c2021-07-31 16:13:27 -070010#include <cstdio>
11#include <cstdlib>
Parker Schuhb59bf5e2016-12-28 21:09:36 -080012
John Park33858a32018-09-28 23:05:48 -070013#include "aos/logging/logging.h"
Parker Schuhb59bf5e2016-12-28 21:09:36 -080014
Stephan Pleinesf63bde82024-01-13 15:59:33 -080015namespace aos::events {
Parker Schuhb59bf5e2016-12-28 21:09:36 -080016
17namespace {
18int MakeSocketNonBlocking(int sfd) {
19 int flags;
20
Austin Schuhf257f3c2019-10-27 21:00:43 -070021 AOS_PCHECK(flags = fcntl(sfd, F_GETFL, 0));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080022
23 flags |= O_NONBLOCK;
Austin Schuhf257f3c2019-10-27 21:00:43 -070024 AOS_PCHECK(fcntl(sfd, F_SETFL, flags));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080025
26 return 0;
27}
28
Parker Schuh309dd722017-02-25 11:31:18 -080029int OpenClient(const std::string &hostname, int portno) {
Parker Schuhb59bf5e2016-12-28 21:09:36 -080030 int sockfd;
31 struct sockaddr_in serveraddr;
32 struct hostent *server;
33 /* socket: create the socket */
Austin Schuhf257f3c2019-10-27 21:00:43 -070034 AOS_PCHECK(sockfd = socket(AF_INET, SOCK_STREAM, 0));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080035
36 /* gethostbyname: get the server's DNS entry */
Parker Schuh309dd722017-02-25 11:31:18 -080037 server = gethostbyname(hostname.c_str());
Parker Schuhb59bf5e2016-12-28 21:09:36 -080038 if (server == NULL) {
Parker Schuh309dd722017-02-25 11:31:18 -080039 fprintf(stderr, "ERROR, no such host as %s\n", hostname.c_str());
Parker Schuhb59bf5e2016-12-28 21:09:36 -080040 exit(-1);
41 }
42
43 /* build the server's Internet address */
44 bzero((char *)&serveraddr, sizeof(serveraddr));
45 serveraddr.sin_family = AF_INET;
46 bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr,
47 server->h_length);
48 serveraddr.sin_port = htons(portno);
49
50 /* connect: create a connection with the server */
Austin Schuhf257f3c2019-10-27 21:00:43 -070051 AOS_PCHECK(connect(sockfd, (const struct sockaddr *)&serveraddr,
52 sizeof(serveraddr)));
53 AOS_PCHECK(MakeSocketNonBlocking(sockfd));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080054
55 return sockfd;
56}
57} // namespace
58
Parker Schuh309dd722017-02-25 11:31:18 -080059TcpClient::TcpClient(const std::string &hostname, int portno)
Parker Schuhb59bf5e2016-12-28 21:09:36 -080060 : EpollEvent(OpenClient(hostname, portno)) {}
61
Stephan Pleinesf63bde82024-01-13 15:59:33 -080062} // namespace aos::events