⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtranssock.c

📁 手写识别Chinput3.0.2源代码,可以在linux下开发手写板程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	    }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 + -