59 if ( packet !=
NULL ) {
78 if ( newdata !=
NULL ) {
80 packet->
data = newdata;
103 if ( packetV !=
NULL ) {
105 for ( i=0; i<howmany; ++
i ) {
107 if ( packetV[i] ==
NULL ) {
113 if ( i != howmany ) {
125 for ( i=0; packetV[
i]; ++
i ) {
142 struct sockaddr_in sock_addr;
147 if ( sock ==
NULL ) {
151 memset(sock, 0,
sizeof(*sock));
152 memset(&sock_addr, 0,
sizeof(sock_addr));
155 sock->channel = socket(AF_INET, SOCK_DGRAM, 0);
163 sock_addr.sin_family = AF_INET;
168 if ( bind(sock->channel, (
struct sockaddr *)&sock_addr,
175 sock_len =
sizeof(sock_addr);
176 if ( getsockname(sock->channel, (
struct sockaddr *)&sock_addr, &sock_len) < 0 ) {
182 sock->address.host = sock_addr.sin_addr.s_addr;
183 sock->address.port = sock_addr.sin_port;
188 setsockopt(sock->channel, SOL_SOCKET, SO_BROADCAST, (
char*)&yes,
sizeof(yes));
191 #ifdef IP_ADD_MEMBERSHIP
203 g.imr_multiaddr.s_addr = inet_addr(
"224.0.0.1");
205 setsockopt(sock->channel, IPPROTO_IP, IP_ADD_MEMBERSHIP,
206 (
char*)&g,
sizeof(g));
230 }
else if (percent > 100) {
233 sock->packetloss = percent;
258 struct UDP_channel *binding;
260 if ( sock ==
NULL ) {
265 if ( channel == -1 ) {
267 binding = &sock->binding[channel];
276 binding = &sock->binding[channel];
282 binding->address[binding->numbound++] = *
address;
290 sock->binding[channel].numbound = 0;
306 address = &sock->address;
311 (sock->binding[channel].numbound > 0) ) {
312 address = &sock->binding[channel].address[0];
329 struct UDP_channel *binding;
332 struct sockaddr_in sock_addr;
334 if ( sock ==
NULL ) {
340 sock_len =
sizeof(sock_addr);
343 for ( i=0; i<npackets; ++
i )
346 if (sock->packetloss) {
347 if ((random()%100) <= sock->packetloss) {
356 if ( packets[i]->channel < 0 )
360 sock_addr.sin_family = AF_INET;
361 status = sendto(sock->channel,
362 packets[i]->
data, packets[i]->
len, 0,
363 (
struct sockaddr *)&sock_addr,sock_len);
374 printf(
"SDLNet_UDP_SendV sending packet to channel = %d\n", packets[i]->channel );
377 binding = &sock->binding[packets[
i]->
channel];
379 for ( j=binding->numbound-1; j>=0; --j )
381 sock_addr.sin_addr.s_addr = binding->address[
j].host;
382 sock_addr.sin_port = binding->address[
j].port;
383 sock_addr.sin_family = AF_INET;
384 status = sendto(sock->channel,
385 packets[i]->
data, packets[i]->
len, 0,
386 (
struct sockaddr *)&sock_addr,sock_len);
426 retval = select(sock+1, &mask,
NULL,
NULL, &tv);
442 struct UDP_channel *binding;
444 struct sockaddr_in sock_addr;
446 if ( sock ==
NULL ) {
451 while ( packets[numrecv] &&
SocketReady(sock->channel) )
455 packet = packets[numrecv];
457 sock_len =
sizeof(sock_addr);
458 packet->
status = recvfrom(sock->channel,
460 (
struct sockaddr *)&sock_addr,
462 if ( packet->
status >= 0 ) {
470 binding = &sock->binding[
i];
472 for ( j=binding->numbound-1; j>=0; --j )
474 if ( (packet->
address.
host == binding->address[j].host) &&
475 (packet->
address.
port == binding->address[j].port) )
DECLSPEC void SDLCALL SDLNet_SetError(const char *fmt,...)
static int SocketReady(SOCKET sock)
static int ValidChannel(int channel)
struct _UDPsocket * UDPsocket
DECLSPEC UDPsocket SDLCALL SDLNet_UDP_Open(Uint16 port)
int SDLNet_GetLastError(void)
DECLSPEC UDPpacket *SDLCALL SDLNet_AllocPacket(int size)
DECLSPEC void SDLCALL SDLNet_UDP_Unbind(UDPsocket sock, int channel)
static UDPpacket ** packets
#define SDLNET_MAX_UDPADDRESSES
DECLSPEC int SDLCALL SDLNet_UDP_SendV(UDPsocket sock, UDPpacket **packets, int npackets)
DECLSPEC void SDLCALL SDLNet_FreePacketV(UDPpacket **packetV)
DECLSPEC UDPpacket **SDLCALL SDLNet_AllocPacketV(int howmany, int size)
#define SDLNET_MAX_UDPCHANNELS
GLuint GLuint64EXT address
DECLSPEC int SDLCALL SDLNet_UDP_Send(UDPsocket sock, int channel, UDPpacket *packet)
DECLSPEC void SDLCALL SDLNet_UDP_SetPacketLoss(UDPsocket sock, int percent)
DECLSPEC void SDLCALL SDLNet_FreePacket(UDPpacket *packet)
uint8_t Uint8
An unsigned 8-bit integer type.
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
DECLSPEC void SDLCALL SDLNet_UDP_Close(UDPsocket sock)
DECLSPEC int SDLCALL SDLNet_UDP_Bind(UDPsocket sock, int channel, const IPaddress *address)
DECLSPEC IPaddress *SDLCALL SDLNet_UDP_GetPeerAddress(UDPsocket sock, int channel)
uint16_t Uint16
An unsigned 16-bit integer type.
void SDLNet_SetLastError(int err)
#define SDLNet_Read16(areap)
DECLSPEC int SDLCALL SDLNet_ResizePacket(UDPpacket *packet, int newsize)
DECLSPEC int SDLCALL SDLNet_UDP_Recv(UDPsocket sock, UDPpacket *packet)
DECLSPEC int SDLCALL SDLNet_UDP_RecvV(UDPsocket sock, UDPpacket **packets)