?? xtranssock.c
字號:
}else {#if defined(CRAY) && defined(OLDTCP) /* Only Cray UNICOS3 and UNICOS4 will define this */ sockname.sin_addr = tmpaddr;#else sockname.sin_addr.s_addr = tmpaddr;#endif /* CRAY and OLDTCP */ } /* * fill in sin_port */ /* Check for number in the port string */ if (!is_numeric (portbuf)) { if ((servp = _XGetservbyname (portbuf,"tcp",sparams)) == NULL) { PRMSG (1,"SocketINETConnect: Can't get service for %s\n", portbuf, 0, 0); return TRANS_CONNECT_FAILED; } sockname.sin_port = servp->s_port; } else { tmpport = (short) atoi (portbuf); sockname.sin_port = htons (tmpport); } PRMSG (4,"SocketINETConnect: sockname.sin_port = %d\n", ntohs(sockname.sin_port), 0, 0); /* * Do the connect() */ if (connect (ciptr->fd, (struct sockaddr *) &sockname, namelen) < 0) {#ifdef WIN32 int olderrno = WSAGetLastError();#else int olderrno = errno;#endif PRMSG (1,"SocketINETConnect: Can't connect: errno = %d\n", EGET(),0, 0); /* * If the error was ECONNREFUSED, the server may be overloaded * and we should try again. * * If the error was EINTR, the connect was interrupted and we * should try again. */ if (olderrno == ECONNREFUSED || olderrno == EINTR) return TRANS_TRY_CONNECT_AGAIN; else return TRANS_CONNECT_FAILED; } /* * Sync up the address fields of ciptr. */ if (TRANS(SocketINETGetAddr) (ciptr) < 0) { PRMSG (1, "SocketINETConnect: ...SocketINETGetAddr() failed:\n", 0, 0, 0); return TRANS_CONNECT_FAILED; } if (TRANS(SocketINETGetPeerAddr) (ciptr) < 0) { PRMSG (1, "SocketINETConnect: ...SocketINETGetPeerAddr() failed:\n", 0, 0, 0); return TRANS_CONNECT_FAILED; } return 0;}#endif /* TCPCONN */#ifdef UNIXCONN/* * Make sure 'host' is really local. */static intUnixHostReallyLocal (host)char *host;{ char hostnamebuf[256]; TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf)); if (strcmp (hostnamebuf, host) == 0) { return (1); } else { /* * A host may have more than one network address. If any of the * network addresses of 'host' (specified to the connect call) * match any of the network addresses of 'hostname' (determined * by TRANS(GetHostname)), then the two hostnames are equivalent, * and we know that 'host' is really a local host. */ char specified_local_addr_list[10][4]; int scount, equiv, i, j; _Xgethostbynameparams hparams; struct hostent *hostp; if ((hostp = _XGethostbyname (host,hparams)) == NULL) return (0); scount = 0; while (hostp->h_addr_list[scount] && scount <= 8) { /* * The 2nd call to gethostname() overrides the data * from the 1st call, so we must save the address list. */ specified_local_addr_list[scount][0] = hostp->h_addr_list[scount][0]; specified_local_addr_list[scount][1] = hostp->h_addr_list[scount][1]; specified_local_addr_list[scount][2] = hostp->h_addr_list[scount][2]; specified_local_addr_list[scount][3] = hostp->h_addr_list[scount][3]; scount++; } if ((hostp = _XGethostbyname (hostnamebuf,hparams)) == NULL) return (0); equiv = 0; i = 0; while (i < scount && !equiv) { j = 0; while (hostp->h_addr_list[j]) { if ((specified_local_addr_list[i][0] == hostp->h_addr_list[j][0]) && (specified_local_addr_list[i][1] == hostp->h_addr_list[j][1]) && (specified_local_addr_list[i][2] == hostp->h_addr_list[j][2]) && (specified_local_addr_list[i][3] == hostp->h_addr_list[j][3])) { /* They're equal, so we're done */ equiv = 1; break; } j++; } i++; } return (equiv); }}static intTRANS(SocketUNIXConnect) (ciptr, host, port)XtransConnInfo ciptr;char *host;char *port;{ struct sockaddr_un sockname; int namelen;#if defined(hpux) && defined(X11_t) struct sockaddr_un old_sockname; int old_namelen;#endif PRMSG (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port); /* * Make sure 'host' is really local. If not, we return failure. * The reason we make this check is because a process may advertise * a "local" network ID for which it can accept connections, but if * a process on a remote machine tries to connect to this network ID, * we know for sure it will fail. */ if (strcmp (host, "unix") != 0 && !UnixHostReallyLocal (host)) { PRMSG (1, "SocketUNIXConnect: Cannot connect to non-local host %s\n", host, 0, 0); return TRANS_CONNECT_FAILED; } /* * Check the port. */ if (!port || !*port) { PRMSG (1,"SocketUNIXConnect: Missing port specification\n", 0, 0, 0); return TRANS_CONNECT_FAILED; } /* * Build the socket name. */ sockname.sun_family = AF_UNIX; if (*port == '/') { /* a full pathname */ sprintf (sockname.sun_path, "%s", port); } else { sprintf (sockname.sun_path, "%s%s", UNIX_PATH, port); }#if defined(BSD44SOCKETS) && !defined(Lynx) sockname.sun_len = strlen (sockname.sun_path); namelen = SUN_LEN (&sockname);#else namelen = strlen (sockname.sun_path) + sizeof (sockname.sun_family);#endif#if defined(hpux) && defined(X11_t) /* * This is gross, but it was in Xlib */ old_sockname.sun_family = AF_UNIX; if (*port == '/') { /* a full pathname */ sprintf (old_sockname.sun_path, "%s", port); } else { sprintf (old_sockname.sun_path, "%s%s", OLD_UNIX_PATH, port); } old_namelen = strlen (old_sockname.sun_path) + sizeof (old_sockname.sun_family);#endif /* * Do the connect() */ if (connect (ciptr->fd, (struct sockaddr *) &sockname, namelen) < 0) { int olderrno = errno; int connected = 0; #if defined(hpux) && defined(X11_t) if (olderrno == ENOENT) { if (connect (ciptr->fd, (struct sockaddr *) &old_sockname, old_namelen) >= 0) { connected = 1; } else olderrno = errno; }#endif if (!connected) { errno = olderrno; PRMSG (1,"SocketUNIXConnect: Can't connect: errno = %d\n", EGET(),0, 0); if (olderrno == ENOENT || olderrno == EINTR) return TRANS_TRY_CONNECT_AGAIN; else return TRANS_CONNECT_FAILED; } } /* * Get the socket name and the peer name from the connect socket, * since this is unix domain. */ if ((ciptr->addr = (char *) xalloc(namelen)) == NULL || (ciptr->peeraddr = (char *) xalloc(namelen)) == NULL) { PRMSG (1, "SocketUNIXCreateListener: Can't allocate space for the addr\n", 0, 0, 0); return TRANS_CONNECT_FAILED; } ciptr->family = AF_UNIX; ciptr->addrlen = namelen; ciptr->peeraddrlen = namelen; memcpy (ciptr->addr, &sockname, ciptr->addrlen); memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen); return 0;}#endif /* UNIXCONN */#endif /* TRANS_CLIENT */static intTRANS(SocketBytesReadable) (ciptr, pend)XtransConnInfo ciptr;BytesReadable_t *pend;{ PRMSG (2,"SocketBytesReadable(%x,%d,%x)\n", ciptr, ciptr->fd, pend);#ifdef WIN32 return ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend);#else#if (defined(i386) && defined(SYSV)) || defined(_SEQUENT_) return ioctl (ciptr->fd, I_NREAD, (char *) pend);#else#if defined(__EMX__) return ioctl (ciptr->fd, FIONREAD, (char*) pend, sizeof(int));#else return ioctl (ciptr->fd, FIONREAD, (char *) pend);#endif /* __EMX__ */#endif /* i386 && SYSV && !SCO || _SEQUENT_ */#endif /* WIN32 */}static intTRANS(SocketRead) (ciptr, buf, size)XtransConnInfo ciptr;char *buf;int size;{ PRMSG (2,"SocketRead(%d,%x,%d)\n", ciptr->fd, buf, size);#if defined(WIN32) || defined(__EMX__) return recv ((SOCKET)ciptr->fd, buf, size, 0);#else return read (ciptr->fd, buf, size);#endif /* WIN32 */}static intTRANS(SocketWrite) (ciptr, buf, size)XtransConnInfo ciptr;char *buf;int size;{ PRMSG (2,"SocketWrite(%d,%x,%d)\n", ciptr->fd, buf, size);#if defined(WIN32) || defined(__EMX__) return send ((SOCKET)ciptr->fd, buf, size, 0);#else return write (ciptr->fd, buf, size);#endif /* WIN32 */}static intTRANS(SocketReadv) (ciptr, buf, size)XtransConnInfo ciptr;struct iovec *buf;int size;{ PRMSG (2,"SocketReadv(%d,%x,%d)\n", ciptr->fd, buf, size); return READV (ciptr, buf, size);}static intTRANS(SocketWritev) (ciptr, buf, size)XtransConnInfo ciptr;struct iovec *buf;int size;{ PRMSG (2,"SocketWritev(%d,%x,%d)\n", ciptr->fd, buf, size); return WRITEV (ciptr, buf, size);}static intTRANS(SocketDisconnect) (ciptr)XtransConnInfo ciptr;{ PRMSG (2,"SocketDisconnect(%x,%d)\n", ciptr, ciptr->fd, 0); return shutdown (ciptr->fd, 2); /* disallow further sends and receives */}#ifdef TCPCONNstatic intTRANS(SocketINETClose) (ciptr)XtransConnInfo ciptr;{ PRMSG (2,"SocketINETClose(%x,%d)\n", ciptr, ciptr->fd, 0); return close (ciptr->fd);}#endif /* TCPCONN */#ifdef UNIXCONNstatic intTRANS(SocketUNIXClose) (ciptr)XtransConnInfo ciptr;{ /* * If this is the server side, then once the socket is closed, * it must be unlinked to completely close it */ struct sockaddr_un *sockname = (struct sockaddr_un *) ciptr->addr; char path[200]; /* > sizeof sun_path +1 */ int ret; PRMSG (2,"SocketUNIXClose(%x,%d)\n", ciptr, ciptr->fd, 0); ret = close(ciptr->fd); if (ciptr->flags && sockname && sockname->sun_family == AF_UNIX && sockname->sun_path[0]) { strncpy (path, sockname->sun_path, ciptr->addrlen - sizeof (sockname->sun_family)); unlink (path); } return ret;}static intTRANS(SocketUNIXCloseForCloning) (ciptr)XtransConnInfo ciptr;{ /* * Don't unlink path. */ int ret; PRMSG (2,"SocketUNIXCloseForCloning(%x,%d)\n", ciptr, ciptr->fd, 0); ret = close(ciptr->fd); return ret;}#endif /* UNIXCONN */#ifdef TCPCONNXtransport TRANS(SocketTCPFuncs) = { /* Socket Interface */ "tcp", 0,#ifdef TRANS_CLIENT TRANS(SocketOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCLTSServer),#endif TRANS(SocketSetOption),#ifdef TRANS_SERVER TRANS(SocketINETCreateListener), NULL, /* ResetListener */ TRANS(SocketINETAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketINETConnect),#endif /* TRANS_CLIENT */ TRANS(SocketBytesReadable), TRANS(SocketRead), TRANS(SocketWrite), TRANS(SocketReadv), TRANS(SocketWritev), TRANS(SocketDisconnect), TRANS(SocketINETClose), TRANS(SocketINETClose), };Xtransport TRANS(SocketINETFuncs) = { /* Socket Interface */ "inet", TRANS_ALIAS,#ifdef TRANS_CLIENT TRANS(SocketOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCLTSServer),#endif TRANS(SocketSetOption),#ifdef TRANS_SERVER TRANS(SocketINETCreateListener), NULL, /* ResetListener */ TRANS(SocketINETAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketINETConnect),#endif /* TRANS_CLIENT */ TRANS(SocketBytesReadable), TRANS(SocketRead), TRANS(SocketWrite), TRANS(SocketReadv), TRANS(SocketWritev), TRANS(SocketDisconnect), TRANS(SocketINETClose), TRANS(SocketINETClose), };#endif /* TCPCONN */#ifdef UNIXCONN#if !defined(LOCALCONN)Xtransport TRANS(SocketLocalFuncs) = { /* Socket Interface */ "local", 0,#ifdef TRANS_CLIENT TRANS(SocketOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCLTSServer),#endif TRANS(SocketSetOption),#ifdef TRANS_SERVER TRANS(SocketUNIXCreateListener), TRANS(SocketUNIXResetListener), TRANS(SocketUNIXAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketUNIXConnect),#endif /* TRANS_CLIENT */ TRANS(SocketBytesReadable), TRANS(SocketRead), TRANS(SocketWrite), TRANS(SocketReadv), TRANS(SocketWritev), TRANS(SocketDisconnect), TRANS(SocketUNIXClose), TRANS(SocketUNIXCloseForCloning), };#endif /* !LOCALCONN */Xtransport TRANS(SocketUNIXFuncs) = { /* Socket Interface */ "unix",#if !defined(LOCALCONN) TRANS_ALIAS,#else 0,#endif#ifdef TRANS_CLIENT TRANS(SocketOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(SocketOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCLTSServer),#endif TRANS(SocketSetOption),#ifdef TRANS_SERVER TRANS(SocketUNIXCreateListener), TRANS(SocketUNIXResetListener), TRANS(SocketUNIXAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(SocketUNIXConnect),#endif /* TRANS_CLIENT */ TRANS(SocketBytesReadable), TRANS(SocketRead), TRANS(SocketWrite), TRANS(SocketReadv), TRANS(SocketWritev), TRANS(SocketDisconnect), TRANS(SocketUNIXClose), TRANS(SocketUNIXCloseForCloning), };#endif /* UNIXCONN */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -