1f4e8e3d3SShuo Chen // Copyright 2010, Shuo Chen.  All rights reserved.
2f4e8e3d3SShuo Chen // http://code.google.com/p/muduo/
3f4e8e3d3SShuo Chen //
4f4e8e3d3SShuo Chen // Use of this source code is governed by a BSD-style license
5f4e8e3d3SShuo Chen // that can be found in the License file.
6f4e8e3d3SShuo Chen 
7f4e8e3d3SShuo Chen // Author: Shuo Chen (chenshuo at chenshuo dot com)
8f4e8e3d3SShuo Chen //
9f4e8e3d3SShuo Chen // This is an internal header file, you should not include this.
10f4e8e3d3SShuo Chen 
11f4e8e3d3SShuo Chen #ifndef MUDUO_NET_SOCKETSOPS_H
12f4e8e3d3SShuo Chen #define MUDUO_NET_SOCKETSOPS_H
13f4e8e3d3SShuo Chen 
14f4e8e3d3SShuo Chen #include <arpa/inet.h>
15f4e8e3d3SShuo Chen #include <endian.h>
16f4e8e3d3SShuo Chen 
17f4e8e3d3SShuo Chen namespace muduo
18f4e8e3d3SShuo Chen {
19f4e8e3d3SShuo Chen namespace sockets
20f4e8e3d3SShuo Chen {
21f4e8e3d3SShuo Chen 
22f4e8e3d3SShuo Chen inline uint64_t hostToNetwork64(uint64_t host64)
23f4e8e3d3SShuo Chen {
24f4e8e3d3SShuo Chen   return htobe64(host64);
25f4e8e3d3SShuo Chen }
26f4e8e3d3SShuo Chen 
27f4e8e3d3SShuo Chen inline uint32_t hostToNetwork32(uint32_t host32)
28f4e8e3d3SShuo Chen {
29f4e8e3d3SShuo Chen   return htonl(host32);
30f4e8e3d3SShuo Chen }
31f4e8e3d3SShuo Chen 
32f4e8e3d3SShuo Chen inline uint16_t hostToNetwork16(uint16_t host16)
33f4e8e3d3SShuo Chen {
34f4e8e3d3SShuo Chen   return htons(host16);
35f4e8e3d3SShuo Chen }
36f4e8e3d3SShuo Chen 
37f4e8e3d3SShuo Chen inline uint64_t networkToHost64(uint64_t net64)
38f4e8e3d3SShuo Chen {
39f4e8e3d3SShuo Chen   return be64toh(net64);
40f4e8e3d3SShuo Chen }
41f4e8e3d3SShuo Chen 
42f4e8e3d3SShuo Chen inline uint32_t networkToHost32(uint32_t net32)
43f4e8e3d3SShuo Chen {
44f4e8e3d3SShuo Chen   return ntohl(net32);
45f4e8e3d3SShuo Chen }
46f4e8e3d3SShuo Chen 
47f4e8e3d3SShuo Chen inline uint16_t networkToHost16(uint16_t net16)
48f4e8e3d3SShuo Chen {
49f4e8e3d3SShuo Chen   return ntohs(net16);
50f4e8e3d3SShuo Chen }
51f4e8e3d3SShuo Chen 
52f4e8e3d3SShuo Chen ///
53f4e8e3d3SShuo Chen /// Creates a non-blocking socket file descriptor,
54f4e8e3d3SShuo Chen /// abort if any error.
55f4e8e3d3SShuo Chen int createNonblockingOrDie();
56f4e8e3d3SShuo Chen 
57f4e8e3d3SShuo Chen+int  connect(int sockfd, const struct sockaddr_in& addr);
58f4e8e3d3SShuo Chen void bindOrDie(int sockfd, const struct sockaddr_in& addr);
59f4e8e3d3SShuo Chen void listenOrDie(int sockfd);
60f4e8e3d3SShuo Chen int  accept(int sockfd, struct sockaddr_in* addr);
61f4e8e3d3SShuo Chen void close(int sockfd);
62f4e8e3d3SShuo Chen void shutdownWrite(int sockfd);
63f4e8e3d3SShuo Chen 
64f4e8e3d3SShuo Chen void toHostPort(char* buf, size_t size,
65f4e8e3d3SShuo Chen                 const struct sockaddr_in& addr);
66f4e8e3d3SShuo Chen void fromHostPort(const char* ip, uint16_t port,
67f4e8e3d3SShuo Chen                   struct sockaddr_in* addr);
68f4e8e3d3SShuo Chen 
69f4e8e3d3SShuo Chen struct sockaddr_in getLocalAddr(int sockfd);
70f4e8e3d3SShuo Chen+struct sockaddr_in getPeerAddr(int sockfd);
71f4e8e3d3SShuo Chen 
72f4e8e3d3SShuo Chen int getSocketError(int sockfd);
73f4e8e3d3SShuo Chen+bool isSelfConnect(int sockfd);
74f4e8e3d3SShuo Chen 
75f4e8e3d3SShuo Chen }
76f4e8e3d3SShuo Chen }
77f4e8e3d3SShuo Chen 
78f4e8e3d3SShuo Chen #endif  // MUDUO_NET_SOCKETSOPS_H
79