📄 connect.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 + -