Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999, Microsoft Corp. All rights reserved.
//
// FILE
//
// sockevt.cpp
//
// SYNOPSIS
//
// Defines the class SocketEvent.
//
// MODIFICATION HISTORY
//
// 02/12/1999 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#include <radcommon.h>
#include <sockevt.h>
DWORD SocketEvent::initialize() throw () { // Create a socket.
s = socket(AF_INET, SOCK_DGRAM, 0); if (s == INVALID_SOCKET) { return WSAGetLastError(); }
int error;
// Bind to an arbitrary port on the loopback interface.
sin.sin_family = AF_INET; sin.sin_port = 0; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); error = bind(s, (sockaddr*)&sin, sizeof(sin));
if (!error) { // Find out which port we bound to.
int namelen = sizeof(sin); error = getsockname(s, (sockaddr*)&sin, &namelen);
if (!error) { // Set the socket to non-blocking.
u_long argp = 1; error = ioctlsocket(s, FIONBIO, &argp); } }
// Clean-up if anything went wrong.
if (error) { closesocket(s); s = INVALID_SOCKET; return WSAGetLastError(); }
return NO_ERROR; }
void SocketEvent::finalize() throw () { if (s != INVALID_SOCKET) { closesocket(s); s = INVALID_SOCKET; } }
DWORD SocketEvent::set() throw () { if (sendto(s, NULL, 0, 0, (sockaddr*)&sin, sizeof(sin))) { return WSAGetLastError(); }
return NO_ERROR; }
void SocketEvent::reset() throw () { // Loop until we've read all the zero-byte sends.
char buf[1]; while (!recv(s, buf, 1, 0)) {} }
|