00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "copyright.h"
00012
#include "system.h"
00013
#include <strings.h>
00014
00015
00016
static void NetworkReadPoll(
int arg)
00017 {
Network *net = (
Network *)arg; net->
CheckPktAvail(); }
00018
static void NetworkSendDone(
int arg)
00019 {
Network *net = (
Network *)arg; net->
SendDone(); }
00020
00021
00022
00023
00024
00025 Network::Network(
NetworkAddress addr,
double reliability,
00026
VoidFunctionPtr readAvail,
VoidFunctionPtr writeDone,
int callArg)
00027 {
00028 ident = addr;
00029
if (reliability < 0) chanceToWork = 0;
00030
else if (reliability > 1) chanceToWork = 1;
00031
else chanceToWork = reliability;
00032
00033
00034 writeHandler = writeDone;
00035 readHandler = readAvail;
00036 handlerArg = callArg;
00037 sendBusy =
FALSE;
00038 inHdr.
length = 0;
00039
00040 sock =
OpenSocket();
00041 sprintf(sockName,
"SOCKET_%d", (
int)addr);
00042
AssignNameToSocket(sockName, sock);
00043
00044
00045
00046
interrupt->
Schedule(NetworkReadPoll, (
int)
this,
NetworkTime,
NetworkRecvInt);
00047 }
00048
00049 Network::~Network()
00050 {
00051
CloseSocket(sock);
00052
DeAssignNameToSocket(sockName);
00053 }
00054
00055
00056
00057
00058
void
00059 Network::CheckPktAvail()
00060 {
00061
00062
interrupt->
Schedule(NetworkReadPoll, (
int)
this,
NetworkTime,
NetworkRecvInt);
00063
00064
if (inHdr.
length != 0)
00065
return;
00066
if (!
PollSocket(sock))
00067
return;
00068
00069
00070
char *buffer =
new char[
MaxWireSize];
00071
ReadFromSocket(sock, buffer,
MaxWireSize);
00072
00073
00074 inHdr = *(
PacketHeader *)buffer;
00075
ASSERT((inHdr.
to == ident) && (inHdr.
length <=
MaxPacketSize));
00076 bcopy(buffer +
sizeof(
PacketHeader), inbox, inHdr.
length);
00077
delete []buffer ;
00078
00079
DEBUG(
'n',
"Network received packet from %d, length %d...\n",
00080 (
int) inHdr.
from, inHdr.
length);
00081
stats->
numPacketsRecvd++;
00082
00083
00084 (*readHandler)(handlerArg);
00085 }
00086
00087
00088
void
00089 Network::SendDone()
00090 {
00091 sendBusy =
FALSE;
00092
stats->
numPacketsSent++;
00093 (*writeHandler)(handlerArg);
00094 }
00095
00096
00097
00098
00099
00100
00101
void
00102 Network::Send(
PacketHeader hdr,
char* data)
00103 {
00104
char toName[32];
00105
00106 sprintf(toName,
"SOCKET_%d", (
int)hdr.
to);
00107
00108
ASSERT((sendBusy ==
FALSE) && (hdr.
length > 0)
00109 && (hdr.
length <=
MaxPacketSize) && (hdr.
from == ident));
00110
DEBUG(
'n',
"Sending to addr %d, %d bytes... ", hdr.
to, hdr.
length);
00111
00112
interrupt->
Schedule(NetworkSendDone, (
int)
this,
NetworkTime,
NetworkSendInt);
00113
00114
if (
Random() % 100 >= chanceToWork * 100) {
00115
DEBUG(
'n',
"oops, lost it!\n");
00116
return;
00117 }
00118
00119
00120
char *buffer =
new char[
MaxWireSize];
00121 *(
PacketHeader *)buffer = hdr;
00122 bcopy(data, buffer +
sizeof(
PacketHeader), hdr.length);
00123
SendToSocket(sock, buffer,
MaxWireSize, toName);
00124
delete []buffer;
00125 }
00126
00127
00128
PacketHeader
00129 Network::Receive(
char* data)
00130 {
00131
PacketHeader hdr = inHdr;
00132
00133 inHdr.
length = 0;
00134
if (hdr.
length != 0)
00135 bcopy(inbox, data, hdr.
length);
00136
return hdr;
00137 }