Network synchronous institution UDP server side SDK code (RFC868C ++Win32SocketUDP)

xiaoxiao2021-03-06  100

#pragma Warning (Disable: 4530) #Pragma Warning (Disable: 4786) #include #include #include #include #include #include #include #include #include #include #include #include #include Using Namespace Std;

#include #include

#include "thread.h" // see the network synchronous school TCP server side SDK code end

char * GetErrorMessage (char * szBuffer, DWORD dwSize) {FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language szBuffer, dwSize - 1, NULL); return szBuffer;}

class RFC868UDPServer: public Thread {long _lWorkCount; // transmission time count bool _fRunFlag; // circulation operation flag SOCKET _S37; // socket u_long _uIP; // ippublic: RFC868UDPServer (): _S37 (INVALID_SOCKET), _lWorkCount (0), _fRunFlag ({_UIP = HTONL (INADDR_ANY); // Default Binding Local IP} ~ RFC868UDPSERVER () {i (_s37! = invalid_socket) CloseSocket (_S37);} // End Thread INLINE BOOL END () {_frunflag = false , Sleep (100); return thread :: end ();} inline boittime = infinite) {_frunflag = false; return! Wait (DWWAITTIME)? Thread :: end (): true;} // Print information Inline void logmessage (char * szstr) {thread :: Lock (); cout << szstr << endl; thread :: unlock ();} // print error message inline void logerror () {charfferror [256]; logMessage (GetErrorMessage (Buffer, 256));} inline long GetWorkCount () {return _lWorkCount;} // set the binding of ip inline void SetIP (char * szIPStr) {_uIP = inet_addr (szIPStr);} inline void SetIP (u_long ip ) {_UIP = IP;} inline virtual bool begin () {structure sockaddr_in server; server.sin_family = af_INet; server.sin_port = htons (37); server.sin_addr.s_addr = _uIP; if ((_ S37 = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) return false; unsigned long NonBlock = 1; if (ioctlsocket (_S37, Fionbio, & nonblock == Socket_ERROR) Return False; if (Bind (_S37, (Struct SockAddr *) & Server, SIZEOF (Server)) == SOCKET_ERROR) RETURN FALSE; RETURN Thread :: begin ();} // Thread Operating Function Virtual void WorkProc () // if Error Return 1 {Char Buffer [256];

Struct SockAddr_in Client; INT C_LEN = SizeOf (Client), RET; FD_SET READ_SET; TIMEVAL TV = {0, 100000}; //tv.tv_sec = 0, TV.tv_usec = 100000;

while (_fRunFlag) {FD_ZERO (& read_set); FD_SET (_S37, & read_set); // select model if (select (0, & read_set, NULL, NULL, & tv) == SOCKET_ERROR) {LogMessage (GetErrorMessage (Buffer, 256)); Continue;} if (fd_is37, & read_set) // Wait until the client {IF (Recvfrom (_S37, NULL, 0, 0, (STRUCT SOCKADDR *) & Client, & C_len)! = Socket_error) {TIME_T CUR_TIME = TIME (NULL ) 2208988800; CHAR S_BUF [4], * TP = ((char *) & cur_time) 3; for (int i = 0; i <4; i ) s_buf [i] = * tp--;

IF (Sendto (_S37, S_BUF, 4, 0, (Struct Sockaddr *) & Client, C_LEN) == Socket_ERROR) {LogMessage (GetErrorMessage (Buffer, 256)); Continue;}

sprintf (Buffer, "udp recvfrom client% s (% d) a null datagram / n", inet_ntoa (client.sin_addr), ntohs (client.sin_port)); LogMessage (Buffer); InterlockedIncrement (& _ lWorkCount);} else LogMessage ( GetErrorMessage (buffer, 256));}}}};

int main (int argc, char * argv []) {try {char buf [256]; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD (2, 2); if (WSAStartup (wVersionRequested, & wsaData)) {cout << GetErrorMessage (BUF, SIZEOF (BUF)) << Endl; Return 1;} RFC868UDPSERVER UDP; UDP.BEGIN (); for (int i = 0; i ) {Sleep (200); if (udp.getworkcount ()> = 5) // Exit Break;} udp.waITEND (200); wsacleanup ();} Catch (Exception & E) {cout << E.WHAT () << Endl;} Return 0;

转载请注明原文地址:https://www.9cbs.com/read-96235.html

New Post(0)