msnet.c

来自「俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)」· C语言 代码 · 共 418 行

C
418
字号
#include <sys/types.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include <sys/wcebase.h>#include <sys/wceerror.h>#include <sys/wcetrace.h>#include <sys/wcenetwork.h>#include <sys/io.h>#define CHECKFD(afd) \  if (afd < 0 || afd >= MAXFDS || _fdtab[afd].fd == -1) { \    errno = EBADF; \    return -1; \  } \  if( _fdtab[afd].type != IO_FILE_TYPE_SOCKET) { \    errno = EBADF; \    return -1; \  }static BOOL M$NET_initialized = FALSE;static WSADATA M$NET_wsadata;  BOOL_m$net_init(){  WORD version;  if (!M$NET_initialized) {    /* Windows CE 3.0 has only WINSOCK Version 1.1 */    version = MAKEWORD(1, 1);    if (WSAStartup(version, &M$NET_wsadata) == 0) {      WCETRACE(WCE_NETWORK, "_m$net_init: winsock 1.1 initialized");      M$NET_initialized = TRUE;      return(TRUE);    } else {      WCETRACE(WCE_NETWORK, "_m$net_init: ERROR - can't initialize winsock 1.1");      return(FALSE);    }  }  return(TRUE);}  intWSAGetLastError(){  return GetLastError();}intaccept(int afd, struct sockaddr *addr, socklen_t *addrlen){  SOCKET s;  SOCKET sr;  int werr;  int fd;  WCETRACE(WCE_IO, "accept: CALLED\n");  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if ((sr = M$_accept(s, addr, addrlen)) == INVALID_SOCKET) {    werr = GetLastError();    errno = _winerr2errno(werr);    return(-1);  }  fd = _getnewfd();  _fdtab[fd].fd = fd;  _fdtab[fd].type = IO_FILE_TYPE_SOCKET;  _fdtab[fd].hnd = (HANDLE) sr;  /*!! is this correct? */  _fdtab[fd].flags = _fdtab[afd].flags;  WCETRACE(WCE_IO, "accept: fd = %d, handle = %d", fd, sr);  return(fd);}intbind(int afd, const struct sockaddr *addr, socklen_t addrlen){  SOCKET s;  int    werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if (M$_bind(s, addr, addrlen) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }  return(0);}intconnect(int afd, const struct sockaddr *addr, socklen_t addrlen){  SOCKET s;  int    werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if (M$_connect(s, addr, addrlen) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }     return(0);}struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type){  struct hostent *hp;  int werr;  WCETRACE(WCE_IO, "gethostbyaddr CALLED w/\"%s\"", addr);  if ((hp = M$_gethostbyaddr(addr, len, type)) == NULL) {    werr = WSAGetLastError();    errno = _winerr2errno(werr);    WCETRACE(WCE_IO, "gethostbyaddr ERROR errno %d", errno);    return(NULL);  }  WCETRACE(WCE_IO, "gethostbyaddr returns %p", hp);  return(hp);}struct hostent *gethostbyname(const char *name){  struct hostent *hp;  int werr;  if ((hp = M$_gethostbyname(name)) == NULL) {    werr = WSAGetLastError();    errno = _winerr2errno(werr);    return(NULL);  }  return(hp);}intgethostname(char *name, size_t buflen){  int werr;  if (M$_gethostname(name, buflen) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno = _winerr2errno(werr);    return(-1);  }  return(0);}char *localhost(){  char *name;  if ((name = malloc(256)) == NULL)    return NULL;  gethostname(name, 256);  return(name);}intgetpeername(int afd, struct sockaddr *addr, socklen_t *addrlen){  SOCKET s;  int werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if (M$_getpeername(s, addr, addrlen) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }     return(0);}intgetsockname(int afd, struct sockaddr *addr, socklen_t *addrlen){  SOCKET s;  int    werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if (M$_getsockname(s, addr, addrlen) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }   return(0);}intgetsockopt(int afd, int level, int optname, void *optval, socklen_t *optlen){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  WCETRACE(WCE_NETWORK, "getsockopt: fd %d level %d optname %d optval %p optlen %d",            afd, level, optname, optval, optlen);  if ((r = M$_getsockopt(s, level, optname, optval, optlen)) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    WCETRACE(WCE_NETWORK, "getsockopt ERROR r %d errno %d werr %d", r, errno, werr);    return(-1);  }    WCETRACE(WCE_NETWORK, "getsockopt SUCCEEDS, r %d", r);  return(r);}intlisten(int afd, int backlog){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if ((r = M$_listen(s, backlog)) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }  return(r);}ssize_trecv(int afd, void *buf, size_t len, int flags){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if ((r = M$_recv(s, buf, len, flags)) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }  return(r);}ssize_trecvfrom(int afd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen){  SOCKET s;  int r, slen, werr;  int frombufsize = *fromlen;  char *mybuf[1500];  struct sockaddr_in remaddr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  WCETRACE(WCE_NETWORK, "recvfrom: fd %d s %d", afd, s);  slen = sizeof(remaddr);  memset(&remaddr, 0, sizeof(remaddr));  if ((r = M$_recvfrom(s, buf, len, 0, (struct sockaddr *)&remaddr, &slen)) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    WCETRACE(WCE_NETWORK, "recvfrom: ERROR errno %d werr %d", errno, werr);    return(-1);  }  /* Winsock's recvfrom() only returns a valid 'from' when the socket   * is connectionless.  Perl expects a valid 'from' for all types   * of sockets, so go the extra mile.   */ *fromlen = slen;  memcpy(from, &remaddr, slen);  if (frombufsize == *fromlen)    getpeername(s, from, fromlen);  WCETRACE(WCE_NETWORK, "recvfrom: OK and DONE");  return(r);}ssize_tsend(int afd, const void *buf, size_t len, int flags){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET) _fdtab[afd].hnd;  if ((r = M$_send(s, (char *)buf, len, flags)) == SOCKET_ERROR) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }  return(r);}ssize_tsendto(int afd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET) _fdtab[afd].hnd;  if ((r = M$_sendto(s, buf, len, flags, to, tolen)) == SOCKET_ERROR) {     werr = WSAGetLastError();     errno =  _winerr2errno(werr);     return(-1);  }  return(r);}intsetsockopt(int afd, int level, int optname, const void *optval, socklen_t optlen){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  WCETRACE(WCE_NETWORK, "setsockopt: fd %d level %d optname %d optval %p optlen %d",            afd, level, optname, optval, optlen);  if ((r = M$_setsockopt(s, level, optname, (char *)optval, optlen)) == SOCKET_ERROR) {      werr = WSAGetLastError();      if (werr == WSAENOPROTOOPT) {       	errno = EINVAL;      } else {        errno = _winerr2errno(werr);      }      WCETRACE(WCE_NETWORK, "setsockopt ERROR r %d errno %d werr %d", r, errno, werr);      return(-1);    }  WCETRACE(WCE_NETWORK, "setsockopt SUCCEEDS, r %d", r);  return(r);}intshutdown(int afd, int how){  SOCKET s;  int r, werr;  CHECKFD(afd);  s = (SOCKET)_fdtab[afd].hnd;  if ((r = M$_shutdown(s, how)) < 0) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    return(-1);  }  return(r);}intsocket(int af, int type, int protocol){  SOCKET s;  int fd, werr;  WCETRACE(WCE_IO, "socket: CALLED");  if ((s = M$_socket(af, type, protocol)) == INVALID_SOCKET) {    werr = WSAGetLastError();    errno =  _winerr2errno(werr);    WCETRACE(WCE_IO, "socket: ERROR errno %d", errno);    return(-1);  }  fd = _getnewfd();  _fdtab[fd].fd = fd;  _fdtab[fd].type = IO_FILE_TYPE_SOCKET;  _fdtab[fd].hnd = (HANDLE) s;  _fdtab[fd].flags = 0;  WCETRACE(WCE_IO, "socket: fd = %d, handle = %d", fd, s);  return(fd);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?