aboutsummaryrefslogtreecommitdiff
path: root/cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text
diff options
context:
space:
mode:
authorneodarz <neodarz@neodarz.net>2018-08-11 20:21:34 +0200
committerneodarz <neodarz@neodarz.net>2018-08-11 20:21:34 +0200
commit0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch)
tree2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text
downloadnevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz
nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip
Initial commit
Diffstat (limited to 'cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text')
-rw-r--r--cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text/x-cvsweb-markup&sortby=date/index.html220
1 files changed, 220 insertions, 0 deletions
diff --git a/cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text/x-cvsweb-markup&sortby=date/index.html b/cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text/x-cvsweb-markup&sortby=date/index.html
new file mode 100644
index 00000000..02dd6ba2
--- /dev/null
+++ b/cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?rev=1.11&content-type=text/x-cvsweb-markup&sortby=date/index.html
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>
+<HEAD><style> A { color:black }</style>
+<!-- hennerik CVSweb $Revision: 1.93 $ -->
+<TITLE>code/nel/src/net/udp_sock.cpp - view - 1.11</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee">
+<table width="100%" border=0 cellspacing=0 cellpadding=1 bgcolor="#aaaaaa"><tr valign=bottom><td><a href="udp_sock.cpp?sortby=date"><IMG SRC="http://www.nevrax.org/inc/img/picto-up.gif" ALT="[BACK]" BORDER="0" WIDTH="14" HEIGHT="13"></a> <b>Return to <A HREF="udp_sock.cpp?sortby=date">udp_sock.cpp</A>
+ CVS log</b> <IMG SRC="http://www.nevrax.org/inc/img/picto-news.gif" ALT="[TXT]" BORDER="0" WIDTH="13" HEIGHT="15"></td><td align=right><IMG SRC="http://www.nevrax.org/inc/img/picto-dir.gif" ALT="[DIR]" BORDER="0" WIDTH="15" HEIGHT="13"> <b>Up to <a href="/cvs/cvsweb.cgi/?sortby=date">Nevrax</a> / <a href="/cvs/cvsweb.cgi/code/?sortby=date">code</a> / <a href="/cvs/cvsweb.cgi/code/nel/?sortby=date">nel</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/?sortby=date">src</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/?sortby=date">net</a></b></td></tr></table><HR noshade><table width="100%"><tr><td bgcolor="#ffffff">File: <a href="/cvs/cvsweb.cgi/?sortby=date">Nevrax</a> / <a href="/cvs/cvsweb.cgi/code/?sortby=date">code</a> / <a href="/cvs/cvsweb.cgi/code/nel/?sortby=date">nel</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/?sortby=date">src</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/?sortby=date">net</a> / <a href="/cvs/cvsweb.cgi/code/nel/src/net/udp_sock.cpp?sortby=date">udp_sock.cpp</a>&nbsp;(<A HREF="/cvs/cvsweb.cgi/~checkout~/code/nel/src/net/udp_sock.cpp?rev=1.11&amp;sortby=date" target="cvs_checkout" onClick="window.open('/cvs/cvsweb.cgi/~checkout~/code/nel/src/net/udp_sock.cpp?rev=1.11','cvs_checkout','resizeable,scrollbars');"><b>download</b></A>)<BR>
+Revision <B>1.11</B>, <i>Wed Apr 17 09:54:00 2002 UTC</i> (3 months, 1 week ago) by <i>cado</i>
+<BR>Branch: <b>MAIN</b>
+<BR>CVS Tags: <b>georges_v2, HEAD</b><BR>Changes since <b>1.10: +3 -4
+ lines</b><PRE>
+BUGFIX: wrong address
+</PRE>
+</td></tr></table><HR noshade><PRE>/** \file udp_sock.cpp
+ * Network engine, layer 0, udp socket
+ *
+ * $Id: udp_sock.cpp,v 1.11 2002/04/17 09:54:00 cado Exp $
+ */
+
+/* Copyright, 2000 Nevrax Ltd.
+ *
+ * This file is part of NEVRAX NEL.
+ * NEVRAX NEL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+
+ * NEVRAX NEL is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with NEVRAX NEL; see the file COPYING. If not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include &quot;stdnet.h&quot;
+
+#include &quot;nel/net/udp_sock.h&quot;
+
+#ifdef NL_OS_WINDOWS
+#include &lt;winsock2.h&gt;
+#define socklen_t int
+#define ERROR_NUM WSAGetLastError()
+
+#elif defined NL_OS_UNIX
+#include &lt;unistd.h&gt;
+#include &lt;sys/types.h&gt;
+#include &lt;sys/time.h&gt;
+#include &lt;sys/socket.h&gt;
+#include &lt;netinet/in.h&gt;
+#include &lt;netinet/tcp.h&gt;
+#include &lt;arpa/inet.h&gt;
+#include &lt;netdb.h&gt;
+#include &lt;errno.h&gt;
+//#include &lt;fcntl.h&gt;
+#define SOCKET_ERROR -1
+#define INVALID_SOCKET -1
+#define ERROR_NUM errno
+#define ERROR_MSG strerror(errno)
+typedef int SOCKET;
+
+#endif
+
+using namespace NLMISC;
+
+namespace NLNET {
+
+
+/*
+ * Constructor
+ */
+CUdpSock::CUdpSock( bool logging ) :
+ &nbsp; &nbsp; &nbsp; &nbsp;CSock( logging ),
+ &nbsp; &nbsp; &nbsp; &nbsp;_Bound( false )
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;// Socket creation
+ &nbsp; &nbsp; &nbsp; &nbsp;createSocket( SOCK_DGRAM, IPPROTO_UDP );
+}
+
+
+/** Binds the socket to the specified port. Call bind() for an unreliable socket if the host acts as a server and waits for
+ * messages. If the host acts as a client, call sendTo(), there is no need to bind the socket.
+ */
+void CUdpSock::bind( uint16 port )
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;CInetAddress addr; // any IP address
+ &nbsp; &nbsp; &nbsp; &nbsp;addr.setPort( port );
+ &nbsp; &nbsp; &nbsp; &nbsp;bind( addr );
+ &nbsp; &nbsp; &nbsp; &nbsp;setLocalAddress(); // will not set the address if the host is multihomed, use bind(CInetAddress) instead
+}
+
+
+/*
+ * Same as bind(uint16) but binds on a specified address/port (useful when the host has several addresses)
+ */
+void CUdpSock::bind( const CInetAddress&amp; addr )
+{
+#ifndef NL_OS_WINDOWS
+ &nbsp; &nbsp; &nbsp; &nbsp;// Set Reuse Address On (does not work on Win98 and is useless on Win2000)
+ &nbsp; &nbsp; &nbsp; &nbsp;int value = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( setsockopt( _Sock, SOL_SOCKET, SO_REUSEADDR, &amp;value, sizeof(value) ) == SOCKET_ERROR )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw ESocket( &quot;ReuseAddr failed&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+#endif
+
+ &nbsp; &nbsp; &nbsp; &nbsp;_LocalAddr = addr;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// Bind the socket
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( ::bind( _Sock, (sockaddr*)(_LocalAddr.sockAddr()), sizeof(sockaddr) ) == SOCKET_ERROR )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw ESocket( &quot;Bind failed&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;_Bound = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( _Logging )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nldebug( &quot;LNETL0: Socket %d bound at %s&quot;, _Sock, _LocalAddr.asString().c_str() );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+}
+
+
+/*
+ * Sends a message
+ */
+void CUdpSock::sendTo( const uint8 *buffer, uint len, const CInetAddress&amp; addr )
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;
+ &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;Send
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( ::sendto( _Sock, (const char*)buffer, len, 0, (sockaddr*)(addr.sockAddr()), sizeof(sockaddr) ) != (sint32)len )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw ESocket( &quot;Unable to send datagram&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+ &nbsp; &nbsp; &nbsp; &nbsp;_BytesSent += len;
+
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( _Logging )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nldebug( &quot;LNETL0: Socket %d sent %d bytes to %s&quot;, _Sock, len, addr.asString().c_str() );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// If socket is unbound, retrieve local address
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( ! _Bound )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setLocalAddress();
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_Bound = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+#ifdef NL_OS_WINDOWS
+ &nbsp; &nbsp; &nbsp; &nbsp;// temporary by ace to know size of SO_MAX_MSG_SIZE
+ &nbsp; &nbsp; &nbsp; &nbsp;static bool first = true;
+ &nbsp; &nbsp; &nbsp; &nbsp;if (first)
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uint MMS, SB;
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;size = sizeof (MMS);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getsockopt (_Sock, SOL_SOCKET, SO_SNDBUF, (char *)&amp;SB, &amp;size);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getsockopt (_Sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&amp;MMS, &amp;size);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nlinfo (&quot;the udp SO_MAX_MSG_SIZE=%u, SO_SNDBUF=%u&quot;, MMS, SB);
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;first = false;
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+#endif
+}
+
+
+/*
+ * Receives data from the peer. (blocking function)
+ */
+void CUdpSock::receive( uint8 *buffer, uint32&amp; len )
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;nlassert( _Connected &amp;&amp; (buffer!=NULL) );
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// Receive incoming message
+ &nbsp; &nbsp; &nbsp; &nbsp;len = ::recv( _Sock, (char*)buffer, len , 0 );
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// Check for errors (after setting the address)
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( len == SOCKET_ERROR )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw ESocket( &quot;Cannot receive data&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;_BytesReceived += len;
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( _Logging )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nldebug( &quot;LNETL0: Socket %d received %d bytes from peer %s&quot;, _Sock, len, _RemoteAddr.asString().c_str() );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+}
+
+
+/*
+ * Receives data and say who the sender is. (blocking function)
+ */
+void CUdpSock::receivedFrom( uint8 *buffer, uint&amp; len, CInetAddress&amp; addr )
+{
+ &nbsp; &nbsp; &nbsp; &nbsp;// Receive incoming message
+ &nbsp; &nbsp; &nbsp; &nbsp;sockaddr_in saddr;
+ &nbsp; &nbsp; &nbsp; &nbsp;socklen_t saddrlen = sizeof(saddr);
+
+ &nbsp; &nbsp; &nbsp; &nbsp;len = ::recvfrom( _Sock, (char*)buffer, len , 0, (sockaddr*)&amp;saddr, &amp;saddrlen );
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// If an error occurs, the saddr is not valid
+ &nbsp; &nbsp; &nbsp; &nbsp;// When the remote socket is closed, get sender's address to know who is quitting
+ &nbsp; &nbsp; &nbsp; &nbsp;addr.setSockAddr( &amp;saddr );
+
+ &nbsp; &nbsp; &nbsp; &nbsp;// Check for errors (after setting the address)
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( len == SOCKET_ERROR )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw ESocket( &quot;Cannot receive data&quot; );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+
+ &nbsp; &nbsp; &nbsp; &nbsp;_BytesReceived += len;
+ &nbsp; &nbsp; &nbsp; &nbsp;if ( _Logging )
+ &nbsp; &nbsp; &nbsp; &nbsp;{
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nldebug( &quot;LNETL0: Socket %d received %d bytes from %s&quot;, _Sock, len, addr.asString().c_str() );
+ &nbsp; &nbsp; &nbsp; &nbsp;}
+}
+
+
+} // NLNET
+</PRE> \ No newline at end of file