eventmachine 0.12.6-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +13 -0
- data/Rakefile +254 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +138 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +15 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/docs/PURE_RUBY +77 -0
- data/docs/README +74 -0
- data/docs/RELEASE_NOTES +96 -0
- data/docs/SMTP +9 -0
- data/docs/SPAWNED_PROCESSES +93 -0
- data/docs/TODO +10 -0
- data/eventmachine.gemspec +32 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +586 -0
- data/ext/cplusplus.cpp +193 -0
- data/ext/ed.cpp +1522 -0
- data/ext/ed.h +380 -0
- data/ext/em.cpp +1937 -0
- data/ext/em.h +186 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +98 -0
- data/ext/eventmachine_cpp.h +95 -0
- data/ext/extconf.rb +129 -0
- data/ext/fastfilereader/extconf.rb +77 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +82 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +351 -0
- data/ext/project.h +119 -0
- data/ext/rubymain.cpp +847 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +423 -0
- data/ext/ssl.h +90 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +113 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1926 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma.rb +32 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/jeventmachine.rb +137 -0
- data/lib/pr_eventmachine.rb +1011 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +129 -0
- data/lib/protocols/httpcli2.rb +803 -0
- data/lib/protocols/httpclient.rb +270 -0
- data/lib/protocols/line_and_text.rb +126 -0
- data/lib/protocols/linetext2.rb +161 -0
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/postgres.rb +261 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +556 -0
- data/lib/protocols/stomp.rb +153 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/setup.rb +1585 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +193 -0
- data/tests/test_attach.rb +83 -0
- data/tests/test_basic.rb +231 -0
- data/tests/test_connection_count.rb +45 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +163 -0
- data/tests/test_error_handler.rb +35 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +77 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +215 -0
- data/tests/test_httpclient2.rb +155 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +188 -0
- data/tests/test_ltp2.rb +320 -0
- data/tests/test_next_tick.rb +109 -0
- data/tests/test_processes.rb +95 -0
- data/tests/test_pure.rb +129 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +74 -0
- data/tests/test_send_file.rb +243 -0
- data/tests/test_servers.rb +80 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +148 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +31 -0
- data/web/whatis +7 -0
- metadata +207 -0
data/ext/em.h
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: em.h
|
6
|
+
Date: 06Apr06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
#ifdef OS_WIN32
|
23
|
+
#include "emwin.h"
|
24
|
+
#endif
|
25
|
+
|
26
|
+
|
27
|
+
// THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
|
28
|
+
//#ifdef OS_UNIX
|
29
|
+
|
30
|
+
#ifndef __EventMachine__H_
|
31
|
+
#define __EventMachine__H_
|
32
|
+
|
33
|
+
#ifdef BUILD_FOR_RUBY
|
34
|
+
#include <ruby.h>
|
35
|
+
#define EmSelect rb_thread_select
|
36
|
+
|
37
|
+
#ifdef HAVE_RBTRAP
|
38
|
+
#include <rubysig.h>
|
39
|
+
#else
|
40
|
+
#define TRAP_BEG
|
41
|
+
#define TRAP_END
|
42
|
+
#endif
|
43
|
+
|
44
|
+
// 1.9.0 compat
|
45
|
+
#ifndef RUBY_UBF_IO
|
46
|
+
#define RUBY_UBF_IO RB_UBF_DFL
|
47
|
+
#endif
|
48
|
+
#else
|
49
|
+
#define EmSelect select
|
50
|
+
#endif
|
51
|
+
|
52
|
+
|
53
|
+
#ifdef OS_UNIX
|
54
|
+
typedef long long Int64;
|
55
|
+
#endif
|
56
|
+
#ifdef OS_WIN32
|
57
|
+
typedef __int64 Int64;
|
58
|
+
#endif
|
59
|
+
|
60
|
+
extern time_t gCurrentLoopTime;
|
61
|
+
|
62
|
+
class EventableDescriptor;
|
63
|
+
|
64
|
+
|
65
|
+
/********************
|
66
|
+
class EventMachine_t
|
67
|
+
********************/
|
68
|
+
|
69
|
+
class EventMachine_t
|
70
|
+
{
|
71
|
+
public:
|
72
|
+
static int GetMaxTimerCount();
|
73
|
+
static void SetMaxTimerCount (int);
|
74
|
+
|
75
|
+
public:
|
76
|
+
EventMachine_t (void(*event_callback)(const char*, int, const char*, int));
|
77
|
+
virtual ~EventMachine_t();
|
78
|
+
|
79
|
+
void Run();
|
80
|
+
void ScheduleHalt();
|
81
|
+
void SignalLoopBreaker();
|
82
|
+
const char *InstallOneshotTimer (int);
|
83
|
+
const char *ConnectToServer (const char *, int);
|
84
|
+
const char *ConnectToUnixServer (const char *);
|
85
|
+
const char *AttachFD (int, bool, bool);
|
86
|
+
|
87
|
+
const char *CreateTcpServer (const char *, int);
|
88
|
+
const char *OpenDatagramSocket (const char *, int);
|
89
|
+
const char *CreateUnixDomainServer (const char*);
|
90
|
+
const char *_OpenFileForWriting (const char*);
|
91
|
+
const char *OpenKeyboard();
|
92
|
+
//const char *Popen (const char*, const char*);
|
93
|
+
const char *Socketpair (char* const*);
|
94
|
+
|
95
|
+
void Add (EventableDescriptor*);
|
96
|
+
void Modify (EventableDescriptor*);
|
97
|
+
int DetachFD (EventableDescriptor*);
|
98
|
+
void ArmKqueueWriter (EventableDescriptor*);
|
99
|
+
void ArmKqueueReader (EventableDescriptor*);
|
100
|
+
|
101
|
+
void SetTimerQuantum (int);
|
102
|
+
static void SetuidString (const char*);
|
103
|
+
static int SetRlimitNofile (int);
|
104
|
+
|
105
|
+
pid_t SubprocessPid;
|
106
|
+
int SubprocessExitStatus;
|
107
|
+
|
108
|
+
int GetConnectionCount();
|
109
|
+
|
110
|
+
// Temporary:
|
111
|
+
void _UseEpoll();
|
112
|
+
void _UseKqueue();
|
113
|
+
|
114
|
+
|
115
|
+
private:
|
116
|
+
bool _RunOnce();
|
117
|
+
bool _RunTimers();
|
118
|
+
void _AddNewDescriptors();
|
119
|
+
void _ModifyDescriptors();
|
120
|
+
void _InitializeLoopBreaker();
|
121
|
+
|
122
|
+
bool _RunSelectOnce();
|
123
|
+
bool _RunEpollOnce();
|
124
|
+
bool _RunKqueueOnce();
|
125
|
+
|
126
|
+
void _ModifyEpollEvent (EventableDescriptor*);
|
127
|
+
|
128
|
+
public:
|
129
|
+
void _ReadLoopBreaker();
|
130
|
+
|
131
|
+
private:
|
132
|
+
enum {
|
133
|
+
HeartbeatInterval = 2,
|
134
|
+
MaxEpollDescriptors = 64*1024
|
135
|
+
};
|
136
|
+
void (*EventCallback)(const char*, int, const char*, int);
|
137
|
+
|
138
|
+
class Timer_t: public Bindable_t {
|
139
|
+
};
|
140
|
+
|
141
|
+
multimap<Int64, Timer_t> Timers;
|
142
|
+
vector<EventableDescriptor*> Descriptors;
|
143
|
+
vector<EventableDescriptor*> NewDescriptors;
|
144
|
+
set<EventableDescriptor*> ModifiedDescriptors;
|
145
|
+
|
146
|
+
time_t NextHeartbeatTime;
|
147
|
+
|
148
|
+
int LoopBreakerReader;
|
149
|
+
int LoopBreakerWriter;
|
150
|
+
#ifdef OS_WIN32
|
151
|
+
struct sockaddr_in LoopBreakerTarget;
|
152
|
+
#endif
|
153
|
+
|
154
|
+
timeval Quantum;
|
155
|
+
|
156
|
+
private:
|
157
|
+
bool bEpoll;
|
158
|
+
int epfd; // Epoll file-descriptor
|
159
|
+
|
160
|
+
bool bKqueue;
|
161
|
+
int kqfd; // Kqueue file-descriptor
|
162
|
+
};
|
163
|
+
|
164
|
+
|
165
|
+
/*******************
|
166
|
+
struct SelectData_t
|
167
|
+
*******************/
|
168
|
+
|
169
|
+
struct SelectData_t
|
170
|
+
{
|
171
|
+
SelectData_t();
|
172
|
+
|
173
|
+
int _Select();
|
174
|
+
|
175
|
+
int maxsocket;
|
176
|
+
fd_set fdreads;
|
177
|
+
fd_set fdwrites;
|
178
|
+
timeval tv;
|
179
|
+
int nSockets;
|
180
|
+
};
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
#endif // __EventMachine__H_
|
185
|
+
|
186
|
+
//#endif // OS_UNIX
|
data/ext/emwin.cpp
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: emwin.cpp
|
6
|
+
Date: 05May06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
|
21
|
+
// THIS ENTIRE FILE IS FOR WINDOWS BUILDS ONLY
|
22
|
+
// INCOMPLETE AND DISABLED FOR NOW.
|
23
|
+
#ifdef xOS_WIN32
|
24
|
+
|
25
|
+
#include "project.h"
|
26
|
+
|
27
|
+
|
28
|
+
// Keep a global variable floating around
|
29
|
+
// with the current loop time as set by the Event Machine.
|
30
|
+
// This avoids the need for frequent expensive calls to time(NULL);
|
31
|
+
time_t gCurrentLoopTime;
|
32
|
+
|
33
|
+
|
34
|
+
/******************************
|
35
|
+
EventMachine_t::EventMachine_t
|
36
|
+
******************************/
|
37
|
+
|
38
|
+
EventMachine_t::EventMachine_t (void (*event_callback)(const char*, int, const char*, int)):
|
39
|
+
EventCallback (event_callback),
|
40
|
+
NextHeartbeatTime (0)
|
41
|
+
{
|
42
|
+
gTerminateSignalReceived = false;
|
43
|
+
Iocp = NULL;
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
/*******************************
|
48
|
+
EventMachine_t::~EventMachine_t
|
49
|
+
*******************************/
|
50
|
+
|
51
|
+
EventMachine_t::~EventMachine_t()
|
52
|
+
{
|
53
|
+
cerr << "EM __dt\n";
|
54
|
+
if (Iocp)
|
55
|
+
CloseHandle (Iocp);
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
/****************************
|
60
|
+
EventMachine_t::ScheduleHalt
|
61
|
+
****************************/
|
62
|
+
|
63
|
+
void EventMachine_t::ScheduleHalt()
|
64
|
+
{
|
65
|
+
/* This is how we stop the machine.
|
66
|
+
* This can be called by clients. Signal handlers will probably
|
67
|
+
* set the global flag.
|
68
|
+
* For now this means there can only be one EventMachine ever running at a time.
|
69
|
+
*/
|
70
|
+
gTerminateSignalReceived = true;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
/*******************
|
76
|
+
EventMachine_t::Run
|
77
|
+
*******************/
|
78
|
+
|
79
|
+
void EventMachine_t::Run()
|
80
|
+
{
|
81
|
+
HookControlC (true);
|
82
|
+
|
83
|
+
Iocp = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL, 0, 0);
|
84
|
+
if (Iocp == NULL)
|
85
|
+
throw std::runtime_error ("no completion port");
|
86
|
+
|
87
|
+
|
88
|
+
DWORD nBytes, nCompletionKey;
|
89
|
+
LPOVERLAPPED Overlapped;
|
90
|
+
|
91
|
+
do {
|
92
|
+
gCurrentLoopTime = time(NULL);
|
93
|
+
// Have some kind of strategy that will dequeue maybe up to 10 completions
|
94
|
+
// without running the timers as long as they are available immediately.
|
95
|
+
// Otherwise in a busy server we're calling them every time through the loop.
|
96
|
+
if (!_RunTimers())
|
97
|
+
break;
|
98
|
+
if (GetQueuedCompletionStatus (Iocp, &nBytes, &nCompletionKey, &Overlapped, 1000)) {
|
99
|
+
}
|
100
|
+
cerr << "+";
|
101
|
+
} while (!gTerminateSignalReceived);
|
102
|
+
|
103
|
+
|
104
|
+
/*
|
105
|
+
while (true) {
|
106
|
+
gCurrentLoopTime = time(NULL);
|
107
|
+
if (!_RunTimers())
|
108
|
+
break;
|
109
|
+
_AddNewDescriptors();
|
110
|
+
if (!_RunOnce())
|
111
|
+
break;
|
112
|
+
if (gTerminateSignalReceived)
|
113
|
+
break;
|
114
|
+
}
|
115
|
+
*/
|
116
|
+
|
117
|
+
HookControlC (false);
|
118
|
+
}
|
119
|
+
|
120
|
+
|
121
|
+
/**************************
|
122
|
+
EventMachine_t::_RunTimers
|
123
|
+
**************************/
|
124
|
+
|
125
|
+
bool EventMachine_t::_RunTimers()
|
126
|
+
{
|
127
|
+
// These are caller-defined timer handlers.
|
128
|
+
// Return T/F to indicate whether we should continue the main loop.
|
129
|
+
// We rely on the fact that multimaps sort by their keys to avoid
|
130
|
+
// inspecting the whole list every time we come here.
|
131
|
+
// Just keep inspecting and processing the list head until we hit
|
132
|
+
// one that hasn't expired yet.
|
133
|
+
|
134
|
+
while (true) {
|
135
|
+
multimap<time_t,Timer_t>::iterator i = Timers.begin();
|
136
|
+
if (i == Timers.end())
|
137
|
+
break;
|
138
|
+
if (i->first > gCurrentLoopTime)
|
139
|
+
break;
|
140
|
+
if (EventCallback)
|
141
|
+
(*EventCallback) ("", EM_TIMER_FIRED, i->second.GetBinding().c_str(), i->second.GetBinding().length());
|
142
|
+
Timers.erase (i);
|
143
|
+
}
|
144
|
+
return true;
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
/***********************************
|
149
|
+
EventMachine_t::InstallOneshotTimer
|
150
|
+
***********************************/
|
151
|
+
|
152
|
+
const char *EventMachine_t::InstallOneshotTimer (int seconds)
|
153
|
+
{
|
154
|
+
if (Timers.size() > MaxOutstandingTimers)
|
155
|
+
return false;
|
156
|
+
// Don't use the global loop-time variable here, because we might
|
157
|
+
// get called before the main event machine is running.
|
158
|
+
|
159
|
+
Timer_t t;
|
160
|
+
Timers.insert (make_pair (time(NULL) + seconds, t));
|
161
|
+
return t.GetBinding().c_str();
|
162
|
+
}
|
163
|
+
|
164
|
+
|
165
|
+
/**********************************
|
166
|
+
EventMachine_t::OpenDatagramSocket
|
167
|
+
**********************************/
|
168
|
+
|
169
|
+
const char *EventMachine_t::OpenDatagramSocket (const char *address, int port)
|
170
|
+
{
|
171
|
+
cerr << "OPEN DATAGRAM SOCKET\n";
|
172
|
+
return "Unimplemented";
|
173
|
+
}
|
174
|
+
|
175
|
+
|
176
|
+
/*******************************
|
177
|
+
EventMachine_t::CreateTcpServer
|
178
|
+
*******************************/
|
179
|
+
|
180
|
+
const char *EventMachine_t::CreateTcpServer (const char *server, int port)
|
181
|
+
{
|
182
|
+
/* Create a TCP-acceptor (server) socket and add it to the event machine.
|
183
|
+
* Return the binding of the new acceptor to the caller.
|
184
|
+
* This binding will be referenced when the new acceptor sends events
|
185
|
+
* to indicate accepted connections.
|
186
|
+
*/
|
187
|
+
|
188
|
+
const char *output_binding = NULL;
|
189
|
+
|
190
|
+
struct sockaddr_in sin;
|
191
|
+
|
192
|
+
SOCKET sd_accept = socket (AF_INET, SOCK_STREAM, 0);
|
193
|
+
if (sd_accept == INVALID_SOCKET) {
|
194
|
+
goto fail;
|
195
|
+
}
|
196
|
+
|
197
|
+
memset (&sin, 0, sizeof(sin));
|
198
|
+
sin.sin_family = AF_INET;
|
199
|
+
sin.sin_addr.s_addr = INADDR_ANY;
|
200
|
+
sin.sin_port = htons (port);
|
201
|
+
|
202
|
+
if (server && *server) {
|
203
|
+
sin.sin_addr.s_addr = inet_addr (server);
|
204
|
+
if (sin.sin_addr.s_addr == INADDR_NONE) {
|
205
|
+
hostent *hp = gethostbyname (server);
|
206
|
+
if (hp == NULL) {
|
207
|
+
//__warning ("hostname not resolved: ", server);
|
208
|
+
goto fail;
|
209
|
+
}
|
210
|
+
sin.sin_addr.s_addr = ((in_addr*)(hp->h_addr))->s_addr;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
|
215
|
+
// No need to set reuseaddr on Windows.
|
216
|
+
|
217
|
+
|
218
|
+
if (bind (sd_accept, (struct sockaddr*)&sin, sizeof(sin))) {
|
219
|
+
//__warning ("binding failed");
|
220
|
+
goto fail;
|
221
|
+
}
|
222
|
+
|
223
|
+
if (listen (sd_accept, 100)) {
|
224
|
+
//__warning ("listen failed");
|
225
|
+
goto fail;
|
226
|
+
}
|
227
|
+
|
228
|
+
{ // Looking good.
|
229
|
+
AcceptorDescriptor *ad = new AcceptorDescriptor (this, sd_accept);
|
230
|
+
if (!ad)
|
231
|
+
throw std::runtime_error ("unable to allocate acceptor");
|
232
|
+
Add (ad);
|
233
|
+
output_binding = ad->GetBinding().c_str();
|
234
|
+
|
235
|
+
CreateIoCompletionPort ((HANDLE)sd_accept, Iocp, NULL, 0);
|
236
|
+
SOCKET sd = socket (AF_INET, SOCK_STREAM, 0);
|
237
|
+
CreateIoCompletionPort ((HANDLE)sd, Iocp, NULL, 0);
|
238
|
+
AcceptEx (sd_accept, sd,
|
239
|
+
}
|
240
|
+
|
241
|
+
return output_binding;
|
242
|
+
|
243
|
+
fail:
|
244
|
+
if (sd_accept != INVALID_SOCKET)
|
245
|
+
closesocket (sd_accept);
|
246
|
+
return NULL;
|
247
|
+
}
|
248
|
+
|
249
|
+
|
250
|
+
/*******************************
|
251
|
+
EventMachine_t::ConnectToServer
|
252
|
+
*******************************/
|
253
|
+
|
254
|
+
const char *EventMachine_t::ConnectToServer (const char *server, int port)
|
255
|
+
{
|
256
|
+
if (!server || !*server || !port)
|
257
|
+
return NULL;
|
258
|
+
|
259
|
+
sockaddr_in pin;
|
260
|
+
unsigned long HostAddr;
|
261
|
+
|
262
|
+
HostAddr = inet_addr (server);
|
263
|
+
if (HostAddr == INADDR_NONE) {
|
264
|
+
hostent *hp = gethostbyname (server);
|
265
|
+
if (!hp)
|
266
|
+
return NULL;
|
267
|
+
HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
|
268
|
+
}
|
269
|
+
|
270
|
+
memset (&pin, 0, sizeof(pin));
|
271
|
+
pin.sin_family = AF_INET;
|
272
|
+
pin.sin_addr.s_addr = HostAddr;
|
273
|
+
pin.sin_port = htons (port);
|
274
|
+
|
275
|
+
int sd = socket (AF_INET, SOCK_STREAM, 0);
|
276
|
+
if (sd == INVALID_SOCKET)
|
277
|
+
return NULL;
|
278
|
+
|
279
|
+
|
280
|
+
LPOVERLAPPED olap = (LPOVERLAPPED) calloc (1, sizeof (OVERLAPPED));
|
281
|
+
cerr << "I'm dying now\n";
|
282
|
+
throw runtime_error ("UNIMPLEMENTED!!!\n");
|
283
|
+
|
284
|
+
}
|
285
|
+
|
286
|
+
|
287
|
+
|
288
|
+
/*******************
|
289
|
+
EventMachine_t::Add
|
290
|
+
*******************/
|
291
|
+
|
292
|
+
void EventMachine_t::Add (EventableDescriptor *ed)
|
293
|
+
{
|
294
|
+
cerr << "ADD\n";
|
295
|
+
}
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
#endif // OS_WIN32
|
300
|
+
|