Ignore:
Timestamp:
Oct 6, 2009, 1:21:11 PM (16 years ago)
Author:
rossy
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Daodan/Flatline/src/Flatline.c

    r457 r460  
    11#include "Flatline.h"
    22
    3 bool Net_Listen(uint16_t port, bool (*packet_callback)(char* data, int datalen, int from))
    4 {
    5         int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    6        
    7         if (sock < 0)
    8         {
    9                 DDrStartupMessage("could not create socket");
    10                 return false;
    11         }
    12        
    13         sockaddr_in address;
    14         memset(&address, 0, sizeof(sockaddr_in));
    15         address.sin_family = AF_INET;
    16         address.sin_addr.s_addr = htonl(INADDR_ANY);
    17         address.sin_port = htons(port);
    18        
    19         if (bind(sock, (sockaddr*)&address, sizeof(sockaddr_in)) < 0)
    20         {
    21                 DDrStartupMessage("could not bind port %d", port);
    22                 closesocket(sock);
    23                 return false;
    24         }
    25        
    26         char data[65537];
    27         data[sizeof(data) - 1] = '\0';
    28         sockaddr_in from;
    29         int recvlen;
    30         for (;;)
    31         {
    32                 int fromlen = sizeof(sockaddr_in);
    33                 memset(&from, 0, sizeof(sockaddr_in));
    34                 recvlen = recvfrom(sock, data, sizeof(data) - 1, 0, (sockaddr*)&from, (void*)&fromlen);
    35                 if (!packet_callback(data, recvlen, ntohl(from.sin_addr.s_addr)))
    36                         break;
    37         }
    38         closesocket(sock);
    39         return true;
    40 }
    41 
    42 int Net_CreateSocket(uint16_t port)
    43 {
    44         int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    45        
    46         if (sock < 0)
    47         {
    48                 DDrStartupMessage("could not create socket");
    49                 return -1;
    50         }
    51        
    52         sockaddr_in address;
    53         memset(&address, 0, sizeof(sockaddr_in));
    54         address.sin_family = AF_INET;
    55         address.sin_addr.s_addr = htonl(INADDR_ANY);
    56         address.sin_port = htons(port);
    57        
    58         if (bind(sock, (sockaddr*)&address, sizeof(sockaddr_in)) < 0)
    59         {
    60                 DDrStartupMessage("could not bind port %d", port);
    61                 return false;
    62         }
    63        
    64         unsigned long nonBlocking = 1;
    65         if (ioctlsocket(sock, FIONBIO, &nonBlocking))
    66         {
    67                 DDrStartupMessage("failed to set non-blocking socket");
    68                 return false;
    69         }
    70        
    71         return sock;
    72 }
    73 
    74 bool Net_Send(int socket, int ip, uint16_t port, char* data, int datalen)
    75 {
    76         sockaddr_in address;
    77         memset(&address, 0, sizeof(sockaddr_in));
    78         address.sin_family = AF_INET;
    79         address.sin_addr.s_addr = ip;
    80         address.sin_port = htons(port);
    81        
    82         return sendto(socket, data, datalen, 0, (sockaddr*)&address, sizeof(address));
    83 }
    84 
    85 void Net_CloseSocket(int sock)
    86 {
    87         closesocket(sock);
    88 }
    89 
    90 bool FLrListen_PacketCallback(char* data, int datalen, int from)
     3bool FLrServer_PacketCallback(char* data, int datalen, int from)
    914{
    925        static int recieved = 0;
     
    9811}
    9912
    100 bool FLrListen_Run()
     13bool FLrServer_Run()
    10114{
    10215        return Net_Listen(27777, FLrListen_PacketCallback);
Note: See TracChangeset for help on using the changeset viewer.