📄 pipmsgsv.cxx
字号:
/* * * C++ Portable Types Library (PTypes) * Version 1.7.5 Released 9-Mar-2003 * * Copyright (c) 2001, 2002, 2003 Hovik Melikyan * * http://www.melikyan.com/ptypes/ * http://ptypes.sourceforge.net/ * */#ifdef WIN32# include <winsock2.h>#else# include <sys/time.h># include <sys/types.h># include <sys/socket.h># include <netinet/in.h># include <arpa/inet.h># include <netdb.h># include <unistd.h># include <time.h>#endif#include "pasync.h"#include "pinet.h"PTYPES_BEGIN//// ipmsgserver: IPv4 UDP socket server//ipmsgserver::ipmsgserver() : ipsvbase(SOCK_DGRAM), ippeerinfo(), handle(invhandle){}ipmsgserver::~ipmsgserver(){ close();}void ipmsgserver::dobind(ipbindinfo* b){ sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(ushort(b->get_port())); sa.sin_addr.s_addr = b->get_ip(); if (::bind(b->handle, (sockaddr*)&sa, sizeof(sa)) != 0) error(*b, usockerrno(), "Couldn't bind address");}void ipmsgserver::close(){ if (!active) return; ipsvbase::close(); handle = invhandle; ippeerinfo::clear();}bool ipmsgserver::poll(int i, int timeout){ if (!active) open(); return dopoll(&i, timeout);}int ipmsgserver::receive(char* buf, int count){ if (!active) open(); ippeerinfo::clear(); // determine which socket has pending data int i = -1; if (!dopoll(&i, -1)) error(*this, EINVAL, "Couldn't read"); ipbindinfo* b = (ipbindinfo*)addrlist[i]; handle = b->handle; // read data sockaddr_in sa; psocklen len = sizeof(sa); int result = ::recvfrom(handle, buf, count, 0, (sockaddr*)&sa, &len); if (result < 0) error(*b, usockerrno(), "Couldn't read"); // set up peer ip and port ip = sa.sin_addr.s_addr; port = ntohs(sa.sin_port); return result;}string ipmsgserver::receive(int max){ string result; setlength(result, max); int numread = receive(pchar(pconst(result)), max); setlength(result, numread); return result;}void ipmsgserver::send(const char* buf, int count){ if (!active || handle == invhandle || ip == ipnone) error(*this, EINVAL, "Couldn't write"); // must receive() first sendto(buf, count, get_ip(), get_port());}void ipmsgserver::sendto(const char* buf, int count, ipaddress ip, int port){ if (!active || handle == invhandle || ip == ipnone) error(*this, EINVAL, "Couldn't write"); // must receive() first sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(ushort(port)); sa.sin_addr.s_addr = ip; if (::sendto(handle, buf, count, 0, (sockaddr*)&sa, sizeof(sa)) < 0) error(*this, usockerrno(), "Couldn't write");}PTYPES_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -