| |
| SOCKET WINAPI InetServerStart( |
| |
LPCTSTR lpszLocalHost, |
|
| |
UINT nLocalPort, |
|
| |
UINT nBacklog, |
|
| |
UINT nMaxClients, |
|
| |
UINT nTimeout, |
|
| |
UINT nPriority, |
|
| |
DWORD dwOptions, |
|
| |
INETEVENTPROC
lpEventProc, |
|
| |
DWORD_PTR dwEventParam, |
|
| |
LPSECURITYCREDENTIALS
lpCredentials |
|
| ); |
The InetServerStart function begins listening for client
connections on the specified local address and port number. The
server is started in its own thread and manages the client sessions
independently of the calling thread. All interaction with the server
and its client sessions takes place inside the callback function
specified by the caller.
Parameters
- lpszLocalHost
- A pointer to a string which specifies the local
hostname or IP address address that the socket should be bound to.
If this parameter is NULL or an empty string, then an appropriate
address will automatically be used. A specific address should only
be used if it is required by the application.
- nLocalPort
- The local port number that the socket should be bound to. This
value must be greater than zero.
- nBacklog
- The maximum length of the queue allocated for pending client
connections. A value of zero specifies that the size of the queue
should be set to a maximum reasonable value. On Windows server
platforms, the maximum value is large enough to queue several
hundred pending connections.
- nMaxClients
- The maximum number of client connections that can be
established with the server. A value of zero specifies that there
should not be any fixed limit on the number of active client
connections. This value can be adjusted after the server has been
created by calling the InetServerThrottle function.
- nTimeout
- The number of seconds the server should wait for a client to
perform a network operation. If the client does not exchange any
information with the server within this period of time, a timeout
event will occur. The timeout value affects all clients that are
connected to the server.
- nPriority
- An integer value which specifies the priority for the server
and all client sessions. The priority for a specific client session
may be modified by calling the InetSetClientPriority
function. This parameter may be one of the following values:
| Constant |
Description |
| INET_PRIORITY_NORMAL |
The default priority which balances resource and processor
utilization. It is recommended that most applications use this
priority. |
| INET_PRIORITY_BACKGROUND |
This priority significantly reduces the memory, processor
and network resource utilization for the client session. It is
typically used with lightweight services running in the
background that are designed for few client connections. The
client thread will be assigned a lower scheduling priority and
will be frequently forced to yield execution to other
threads. |
| INET_PRIORITY_LOW |
This priority lowers the overall resource utilization for
the client session and meters the processor utilization for the
client session. The client thread will be assigned a lower
scheduling priority and will occasionally be forced to yield
execution to other threads. |
| INET_PRIORITY_HIGH |
This priority increases the overall resource utilization
for the client session and the thread will be given higher
scheduling priority. It can be used when it is important for
the client session thread to be highly responsive. It is not
recommended that this priority be used on a system with a
single processor. |
| INET_PRIORITY_CRITICAL |
This priority can significantly increase processor, memory
and network utilization. The thread will be given higher
scheduling priority and will be more responsive to the remote
host. It is not recommended that this priority be used on a
system with a single processor. |
- dwOptions
- An unsigned integer used to specify one or more socket
options. The following values are supported:
| Constant |
Description |
| INET_OPTION_NONE |
No option specified. If the address and port number are in
use by another application or a closed socket which was
listening on this port is still in the TIME_WAIT state, the
function will fail. |
| INET_OPTION_REUSEADDRESS |
This option specifies the local address can be reused.
This option enables a server application to listen for
connections using the specified address and port number even if
they were in use recently. This is typically used to enable an
application to close the listening socket and immediately
reopen it without getting an error that the address is in
use. |
| INET_OPTION_KEEPALIVE |
This option specifies that packets are to be sent to the
remote system when no data is being exchanged to keep the
connection active. Enabling this option will also help applications
detect the physical loss of a network connection, such as an
Ethernet cable being unplugged. This option does not guarantee
that persistent connections will be maintained over long periods
of time. |
| INET_OPTION_NODELAY |
This option disables the Nagle algorithm, which buffers
unacknowledged data and combines smaller packets into a single
larger packet when sending data to a remote host. Specifying
this option can improve the responsiveness and overall
throughput of applications that implement their own buffering
and exchange large amounts of information. |
| INET_OPTION_SECURE |
This option specifies that a secure connection should be
established with the client, where the client immediately
initiates the SSL handshake when it connects to the server. To
implement an explicit SSL session, where the client establishes
a standard, non-secure connection and then sends a command to
the server to initiate a secure session, you should not use this
option. Instead, use the InetEnableSecurity function to
selectively enable SSL for the client session. |
- lpEventProc
- Specifies the address of the application defined callback
function. For more information about the callback function, see the
description of the InetEventProc callback function. This
parameter cannot be NULL.
- dwEventParam
- A user-defined integer value that is passed to the callback
function.
- lpCredentials
- Pointer to credentials structure SECURITYCREDENTIALS. This may be
NULL, unless the dwOptions parameter includes
INET_OPTION_SECURE. When a secure session is specified, the fields
dwSize, lpszCertStore, and lpszCertName must
be defined, while other fields may be left undefined. Set
dwSize to the size of the SECURITYCREDENTIALS
structure.
Return Value
If the function succeeds, the return value is a socket handle. If
the function fails, the return value is INVALID_SOCKET. To get
extended error information, call InetGetLastError.
Remarks
In most cases, the lpszLocalHost parameter should be a NULL
pointer or an empty string. On a multihomed system, this will enable
the server to accept connections on any appropriately configured
network adapter. Specifying a hostname or IP address will limit
client connections to that particular address. Note that the hostname
or address must be one that is assigned to the local system,
otherwise an error will occur.
If an IPv6 address is specified as the local address, the system
must have an IPv6 stack installed and configured, otherwise the
function will fail.
To listen for connections on any suitable IPv4 interface, specify
the special dotted-quad address "0.0.0.0". You can accept
connections from clients using either IPv4 or IPv6 on the same socket by
specifying the special IPv6 address "::0", however this is only
supported on Windows 7 and Windows Server 2008 R2 or later platforms. If
no local address is specified, then the server will only listen for
connections from clients using IPv4. This behavior is by design for
backwards compatibility with systems that do not have an IPv6 TCP/IP
stack installed.
If the INET_OPTION_REUSEADDRESS option is not specified, an error may
be returned if a listening socket was recently created for the same
local address and port number. By default, once a listening socket is
closed there is a period of time that all applications must wait
before the address can be reused (this is called the TIME_WAIT
state). The actual amount of time depends on the operating system and
configuration parameters, but is typically two to four minutes.
Specifying this option enables an application to immediately re-use a
local address and port number that was previously in use. Note that
this does not permit more than one server to bind to the same
address.
When the event handler callback function is invoked by the server,
it normally executes in the context of the worker thread that manages
that client session. This means that even if you do not explicitly
create any threads in your application, you must design your program
to be thread-safe, with synchronized access to global objects and
data. If your application has a user interface, only the main UI
thread should attempt to modify controls. If you attempt to modify a
control from a worker thread, such as adding a row to a listbox
control, it can result the application becoming deadlocked. This means
that you should not attempt to directly update the UI from within the
event handler function. To enable asynchronous server notifications
for a GUI application, use the InetServerAsyncNotify function.
The socket handle returned by this function references the
listening socket that was created when the server was started. The
service is managed in another thread, and all interaction with the
server and active client connections are performed inside the
event handler. To disconnect all active connections, close
the listening socket and terminate the server thread, call the
InetServerStop function.
Example
#define SERVER_PORT 7000
#define SERVER_CLIENTS 100
SOCKET hServer = INVALID_SOCKET;
// Accept connections from clients that connection on port 7000 with a default
// backlog of 5 connections and a maximum of 100 client connections.
hServer = InetServerStart(NULL,
SERVER_PORT,
INET_BACKLOG,
SERVER_CLIENTS,
INET_TIMEOUT,
INET_PRIORITY_NORMAL,
INET_OPTION_REUSEADDRESS,
MyEventHandler,
0,
NULL);
if (hServer == INVALID_SOCKET)
{
DWORD dwError;
TCHAR szError[256];
dwError = InetGetLastError();
InetGetErrorString(dwError, szError, 256);
MessageBox(NULL, szError, NULL, MB_OK|MB_TASKMODAL);
return;
}
Requirements
Minimum Desktop Platform: Windows 7 (Service Pack 1)
Minimum Server Platform: Windows Server 2008 R2 (Service Pack 1)
Header: Include cswsock10.h
Import Library: cswskv10.lib
See Also
InetGetServerData,
InetGetServerPriority,
InetGetServerStatus,
InetServerLock,
InetServerRestart,
InetServerResume,
InetServerStop,
InetServerSuspend,
InetServerThrottle,
InetServerUnlock,
InetSetServerData,
InetSetServerPriority
|
|