blob: 65b646c5399cb1e45e36d6e0d3f33ae156741d15 [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>
Parker Schuhb59bf5e2016-12-28 21:09:36 -08007#include <sys/socket.h>
8#include <sys/types.h>
9#include <unistd.h>
Tyler Chatowbf0609c2021-07-31 16:13:27 -070010
11#include <cerrno>
12#include <cstdio>
13#include <cstdlib>
14#include <cstring>
Parker Schuhb59bf5e2016-12-28 21:09:36 -080015
John Park33858a32018-09-28 23:05:48 -070016#include "aos/logging/logging.h"
Parker Schuhb59bf5e2016-12-28 21:09:36 -080017
Stephan Pleinesf63bde82024-01-13 15:59:33 -080018namespace aos::events {
Parker Schuhb59bf5e2016-12-28 21:09:36 -080019
20namespace {
21int MakeSocketNonBlocking(int sfd) {
22 int flags;
23
Austin Schuhf257f3c2019-10-27 21:00:43 -070024 AOS_PCHECK(flags = fcntl(sfd, F_GETFL, 0));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080025
26 flags |= O_NONBLOCK;
Austin Schuhf257f3c2019-10-27 21:00:43 -070027 AOS_PCHECK(fcntl(sfd, F_SETFL, flags));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080028
29 return 0;
30}
31
Parker Schuh309dd722017-02-25 11:31:18 -080032int OpenClient(const std::string &hostname, int portno) {
Parker Schuhb59bf5e2016-12-28 21:09:36 -080033 int sockfd;
34 struct sockaddr_in serveraddr;
35 struct hostent *server;
36 /* socket: create the socket */
Austin Schuhf257f3c2019-10-27 21:00:43 -070037 AOS_PCHECK(sockfd = socket(AF_INET, SOCK_STREAM, 0));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080038
39 /* gethostbyname: get the server's DNS entry */
Parker Schuh309dd722017-02-25 11:31:18 -080040 server = gethostbyname(hostname.c_str());
Parker Schuhb59bf5e2016-12-28 21:09:36 -080041 if (server == NULL) {
Parker Schuh309dd722017-02-25 11:31:18 -080042 fprintf(stderr, "ERROR, no such host as %s\n", hostname.c_str());
Parker Schuhb59bf5e2016-12-28 21:09:36 -080043 exit(-1);
44 }
45
46 /* build the server's Internet address */
47 bzero((char *)&serveraddr, sizeof(serveraddr));
48 serveraddr.sin_family = AF_INET;
49 bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr,
50 server->h_length);
51 serveraddr.sin_port = htons(portno);
52
53 /* connect: create a connection with the server */
Austin Schuhf257f3c2019-10-27 21:00:43 -070054 AOS_PCHECK(connect(sockfd, (const struct sockaddr *)&serveraddr,
55 sizeof(serveraddr)));
56 AOS_PCHECK(MakeSocketNonBlocking(sockfd));
Parker Schuhb59bf5e2016-12-28 21:09:36 -080057
58 return sockfd;
59}
60} // namespace
61
Parker Schuh309dd722017-02-25 11:31:18 -080062TcpClient::TcpClient(const std::string &hostname, int portno)
Parker Schuhb59bf5e2016-12-28 21:09:36 -080063 : EpollEvent(OpenClient(hostname, portno)) {}
64
Stephan Pleinesf63bde82024-01-13 15:59:33 -080065} // namespace aos::events