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

📄 connect.c

📁 UNIX/LINUX平台下面SMS网管原代码
💻 C
字号:
#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include <signal.h>#include "etc.h"#define	FAILURE	-1#define	SUCCESS	 0static int timeout ;int SocketTimeOut = 20 ;int ConnectServer(char *hostname, short s_remote_port);extern char etcfile[128];void settimeout();int CommHost(char *recv, int *rlen, char *send, int slen){	int  recv_len;	int  send_len;	char tmp[512];	char recv_buf[20480];	int  iflag = 0x1;	int  head = 0;	int  flag;	int  sd = -1;	int  ret = -1;	int  len = -1;	char len_buf[4 + 1];	char Ip[32];	int  Port = 8888;	if(GetValueFromEtcFile(etcfile, "HOST", "Ip", Ip, 32) != ETC_OK ) 	{		bms_trace("Get UID failed");                return FAILURE;        }        if(GetIntValueFromEtcFile(etcfile, "HOST", "Port", &Port) != ETC_OK )        {                bms_trace("Get PIN failed");                return FAILURE;        }	fprintf(stdout, "Ip = [%s]\n", Ip);	fprintf(stdout, "Port = [%d]\n", Port);	if( (sd=ConnectServer(Ip, Port)) < 0 ) 	{		printf("FAILED to connect\n");		close( sd) ;		return( FAILURE) ;	}	/* 1.发送报文长度 */	sprintf(len_buf, "%04d", slen);	bms_trace("len_buf[%d]",slen);	if ( WriteN( sd, (char *)len_buf, 4) != 4) 	{		printf( "Send header failed!\n") ;		close(sd) ;		return( FAILURE) ;	}	bms_trace("send[%s]",send);	/* 2.发送报文 */	if ( WriteN( sd, (char *)send, slen) != slen) 	{		printf( "Send content failed!\n") ;		close(sd) ;		return( FAILURE) ;	}	/* 3.接收长度 */	memset(len_buf, 0, sizeof(len_buf));	if( (ret = readn(sd, (char *)len_buf, 4 ) ) != 4 )	{		printf( "Get header failed !" ) ;		close( sd) ;		return( FAILURE) ;	}	bms_trace("len_buf[%s]",len_buf);	len_buf[4] = 0;	len = atoi(len_buf);	/* 接收正文 */	fprintf(stdout,"recv len = [%d]\n", len);	memset(recv_buf, 0, sizeof(recv_buf));	if( (ret = readn(sd, (char *)recv_buf, len ) ) != len )	{		printf( "Get content failed [%d]!\n", ret) ;		close(sd) ;		return( FAILURE) ;	}	//bms_trace("recv_buf[%s]",recv_buf);	memcpy(recv, recv_buf, len );	//memcpy(recv, recv_buf, strlen(recv_buf));	fprintf(stdout,"recv_buf1[%s]",recv);	*rlen = len;	close(sd);	return SUCCESS;}int ConnectServer(char *hostname, short s_remote_port){    static  char cache_hostname[128];      static  int first_call = TRUE;         static  struct sockaddr_in	ser_addr;    struct  sockaddr_in backup;	          int	    sd;    struct  hostent *h;    struct  in_addr *p;    void (* sigfn)() ;    if (first_call)     {		cache_hostname[0] = '\0';		first_call = FALSE;    }    if (strcmp(hostname, cache_hostname) != 0)     {	/* Make a backup first */	backup = ser_addr;	/* Get IP address of the host */	memset((char *) &ser_addr, 0, sizeof(ser_addr));	ser_addr.sin_family = AF_INET;	ser_addr.sin_addr.s_addr = inet_addr(hostname);	if ((long) ser_addr.sin_addr.s_addr == INADDR_NONE)     {    	    h = gethostbyname(hostname);	    if (h != NULL)         {		p = (struct in_addr *) (h->h_addr_list[0]);		ser_addr.sin_addr.s_addr = p->s_addr;	    }	    else             {		/* Cannot resolve address */		/* Restore from backup */		ser_addr = backup;		return -1;	    }	}	/* Cache hostname */	strcpy(cache_hostname, hostname);    }    /* Then setup port for all cases */    ser_addr.sin_port = htons(s_remote_port);    /* Open socket */    sd = socket(AF_INET, SOCK_STREAM, 0);    if (sd < 0)    {		printf("Socket failed\n");		return -2;    }    sigfn = signal( SIGALRM, settimeout);    alarm(5) ;    if (connect(sd, (struct sockaddr *) &ser_addr, sizeof(ser_addr)) < 0)     {    		alarm(0) ;		close(sd);		return -3;    }    alarm(0) ;    return sd;}int  WriteN( int fd, char *ptr, int nbytes) {	int  nleft, nwriten ;	nleft = nbytes ;	while ( nleft > 0 )	{		nwriten = write( fd, ptr, nleft) ;		if ( nwriten <= 0 )			return( nwriten) ;		/*  error*/		nleft = nleft - nwriten ;		ptr += nwriten ;	}	return( nbytes - nleft) ;}/* ------------------------------------------------------------------------    如果返回值 < 0 时, 表明系统出错,               = 0 时, 表明客户挂连接,               < nbytes 时, 表明数据包接收不完整,               = nbytes 时, 表明数据包接收完整--------------------------------------------------------------------------- */int  readn( int fd, char *ptr, int nbytes){	void (* sigfn)() ;	int  nleft, nread ;	void settimeout() ;	nleft = nbytes ;	while ( nleft > 0 )	{		timeout = 0 ;		sigfn = signal( SIGALRM, settimeout) ;		alarm( SocketTimeOut) ;		nread = read( fd, ptr, nleft) ;		alarm( 0) ;		signal( SIGALRM, sigfn) ;		if ( timeout == 1 )			return ( -1) ;		/*  error*/		if ( nread < 0 )			return ( nread) ;	/*  error*/		if ( nread == 0 )			break ;			/*  EOF*/		nleft = nleft - nread ;		ptr = ptr + nread ;	}	return ( nbytes - nleft) ;		/*  return >= 0*/}void settimeout(){	timeout = 0 ;}

⌨️ 快捷键说明

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