Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
d705a92e
Commit
d705a92e
authored
7 years ago
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
net/IPv4Address: new class
parent
614b3634
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
200 additions
and
16 deletions
+200
-16
Makefile.am
Makefile.am
+1
-0
ServerSocket.cxx
src/event/ServerSocket.cxx
+2
-8
IPv4Address.cxx
src/net/IPv4Address.cxx
+46
-0
IPv4Address.hxx
src/net/IPv4Address.hxx
+147
-0
EventPipe.cxx
src/system/EventPipe.cxx
+4
-8
No files found.
Makefile.am
View file @
d705a92e
...
...
@@ -482,6 +482,7 @@ libnet_a_SOURCES = \
src/net/Resolver.cxx src/net/Resolver.hxx
\
src/net/StaticSocketAddress.cxx src/net/StaticSocketAddress.hxx
\
src/net/AllocatedSocketAddress.cxx src/net/AllocatedSocketAddress.hxx
\
src/net/IPv4Address.cxx src/net/IPv4Address.hxx
\
src/net/SocketAddress.cxx src/net/SocketAddress.hxx
\
src/net/SocketUtil.cxx src/net/SocketUtil.hxx
\
src/net/SocketDescriptor.cxx src/net/SocketDescriptor.hxx
\
...
...
This diff is collapsed.
Click to expand it.
src/event/ServerSocket.cxx
View file @
d705a92e
...
...
@@ -19,6 +19,7 @@
#include "config.h"
#include "ServerSocket.hxx"
#include "net/IPv4Address.hxx"
#include "net/StaticSocketAddress.hxx"
#include "net/AllocatedSocketAddress.hxx"
#include "net/SocketAddress.hxx"
...
...
@@ -48,7 +49,6 @@
#include <ws2tcpip.h>
#include <winsock.h>
#else
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#endif
...
...
@@ -310,13 +310,7 @@ ServerSocket::AddFD(int _fd)
inline
void
ServerSocket
::
AddPortIPv4
(
unsigned
port
)
{
struct
sockaddr_in
sin
;
memset
(
&
sin
,
0
,
sizeof
(
sin
));
sin
.
sin_port
=
htons
(
port
);
sin
.
sin_family
=
AF_INET
;
sin
.
sin_addr
.
s_addr
=
INADDR_ANY
;
AddAddress
({(
const
sockaddr
*
)
&
sin
,
sizeof
(
sin
)});
AddAddress
(
IPv4Address
(
port
));
}
#ifdef HAVE_IPV6
...
...
This diff is collapsed.
Click to expand it.
src/net/IPv4Address.cxx
0 → 100644
View file @
d705a92e
/*
* Copyright (C) 2012-2017 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "IPv4Address.hxx"
#include <assert.h>
static
const
struct
sockaddr_in
*
CastToIPv4
(
const
struct
sockaddr
*
p
)
{
assert
(
p
->
sa_family
==
AF_INET
);
/* cast through void to work around the bogus alignment warning */
const
void
*
q
=
reinterpret_cast
<
const
void
*>
(
p
);
return
reinterpret_cast
<
const
struct
sockaddr_in
*>
(
q
);
}
IPv4Address
::
IPv4Address
(
SocketAddress
src
)
:
address
(
*
CastToIPv4
(
src
.
GetAddress
()))
{}
This diff is collapsed.
Click to expand it.
src/net/IPv4Address.hxx
0 → 100644
View file @
d705a92e
/*
* Copyright (C) 2012-2017 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef IPV4_ADDRESS_HXX
#define IPV4_ADDRESS_HXX
#include "SocketAddress.hxx"
#include "system/ByteOrder.hxx"
#include <stdint.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <netinet/in.h>
#endif
/**
* An OO wrapper for struct sockaddr_in.
*/
class
IPv4Address
{
struct
sockaddr_in
address
;
#ifdef WIN32
static
constexpr
struct
in_addr
ConstructInAddr
(
uint8_t
a
,
uint8_t
b
,
uint8_t
c
,
uint8_t
d
)
{
return
{{{
a
,
b
,
c
,
d
}}};
}
static
constexpr
struct
in_addr
ConstructInAddr
(
uint32_t
x
)
{
return
ConstructInAddr
(
x
>>
24
,
x
>>
16
,
x
>>
8
,
x
);
}
#else
#ifdef __BIONIC__
typedef
uint32_t
in_addr_t
;
#endif
static
constexpr
in_addr_t
ConstructInAddrT
(
uint8_t
a
,
uint8_t
b
,
uint8_t
c
,
uint8_t
d
)
{
return
ToBE32
((
a
<<
24
)
|
(
b
<<
16
)
|
(
c
<<
8
)
|
d
);
}
static
constexpr
struct
in_addr
ConstructInAddr
(
uint32_t
x
)
{
return
{
ToBE32
(
x
)
};
}
static
constexpr
struct
in_addr
ConstructInAddr
(
uint8_t
a
,
uint8_t
b
,
uint8_t
c
,
uint8_t
d
)
{
return
{
ConstructInAddrT
(
a
,
b
,
c
,
d
)
};
}
#endif
static
constexpr
struct
sockaddr_in
Construct
(
struct
in_addr
address
,
uint16_t
port
)
{
return
{
#if defined(__APPLE__)
sizeof
(
struct
sockaddr_in
),
#endif
AF_INET
,
ToBE16
(
port
),
address
,
{},
};
}
static
constexpr
struct
sockaddr_in
Construct
(
uint32_t
address
,
uint16_t
port
)
{
return
Construct
(
ConstructInAddr
(
address
),
port
);
}
public
:
IPv4Address
()
=
default
;
constexpr
IPv4Address
(
struct
in_addr
_address
,
uint16_t
port
)
:
address
(
Construct
(
_address
,
port
))
{}
constexpr
IPv4Address
(
uint8_t
a
,
uint8_t
b
,
uint8_t
c
,
uint8_t
d
,
uint16_t
port
)
:
IPv4Address
(
ConstructInAddr
(
a
,
b
,
c
,
d
),
port
)
{}
constexpr
explicit
IPv4Address
(
uint16_t
port
)
:
IPv4Address
(
ConstructInAddr
(
INADDR_ANY
),
port
)
{}
/**
* Convert a #SocketAddress to a #IPv4Address. Its address family must be AF_INET.
*/
explicit
IPv4Address
(
SocketAddress
src
);
static
constexpr
struct
in_addr
Loopback
()
{
return
ConstructInAddr
(
INADDR_LOOPBACK
);
}
operator
SocketAddress
()
const
{
return
SocketAddress
(
reinterpret_cast
<
const
struct
sockaddr
*>
(
&
address
),
sizeof
(
address
));
}
SocketAddress
::
size_type
GetSize
()
{
return
sizeof
(
address
);
}
constexpr
bool
IsDefined
()
const
{
return
address
.
sin_family
!=
AF_UNSPEC
;
}
constexpr
uint16_t
GetPort
()
const
{
return
FromBE16
(
address
.
sin_port
);
}
void
SetPort
(
uint16_t
port
)
{
address
.
sin_port
=
ToBE16
(
port
);
}
constexpr
const
struct
in_addr
&
GetAddress
()
const
{
return
address
.
sin_addr
;
}
};
#endif
This diff is collapsed.
Click to expand it.
src/system/EventPipe.cxx
View file @
d705a92e
...
...
@@ -28,9 +28,9 @@
#include <unistd.h>
#ifdef WIN32
#include <ws2tcpip.h>
#include "net/IPv4Address.hxx"
#include <winsock2.h>
#include <cstring>
/* for memset() */
#endif
#ifdef WIN32
...
...
@@ -112,14 +112,10 @@ static bool PoorSocketPair(int fd[2])
closesocket
(
listen_socket
);
};
sockaddr_in
address
;
std
::
memset
(
&
address
,
0
,
sizeof
(
address
));
address
.
sin_family
=
AF_INET
;
address
.
sin_addr
.
s_addr
=
htonl
(
INADDR_LOOPBACK
);
IPv4Address
address
(
IPv4Address
::
Loopback
(),
0
);
int
ret
=
bind
(
listen_socket
,
reinterpret_cast
<
sockaddr
*>
(
&
address
),
sizeof
(
address
));
SocketAddress
(
address
).
GetAddress
(),
sizeof
(
address
));
if
(
ret
<
0
)
return
false
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment