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

📄 tcp.c

📁 API
💻 C
字号:
/************************************************************************
*   程序名       : tcp.c   
*   功  能       : Before call send_to_len()  , you must handle the data
*			   snddata : snd_len(2Bytes) + snddata
*			   snd_len : snd_len + 2 
*   		   After return from  readn() , you must handle the data
*			   revdata : revdata(delete first two bytes)
*			   rev_len : rev_len - 2 
*		   Notes : the first bytes is the length of data sent or
*			   received
*   调用模块     : 
*   最后修改者   : ZongyuLi
*   最后修改日期 : 1996/08/04
************************************************************************/
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ndir.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <setjmp.h>
#include "mytools.h"
#include "public.h"
#include "msgsys.h"

extern 	errno ;
extern	int	connect_timeout ;
jmp_buf	position ;
int	timeout_flag ;
int	catch();

/*--------------------------------------------------------------------
return:	 0 --- SUCC
	-1 --- FAIL
----------------------------------------------------------------------
*/
send_to_net( send_port , hostaddr , senddata , snd_len )
int	send_port ;
char	*hostaddr , *senddata ;
int	snd_len ;
{
struct	hostent *h;
struct	sockaddr_in sin ;
int	i , j ;
int	on=1 ;
int  	sock ;

//printf("len=[%d]\n",snd_len);
//printf("begin : snddata=[%s]\n",senddata);
	if ((sock = socket(AF_INET, SOCK_STREAM, 6)) < 0) {
		errcall(ERROR, "TCP Sock err , send_to_net()!");
		return(-1);
    	}

	/* set socket options */
	if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) < 0)
	{
		close(sock);
		errcall(ERROR, "TCP Setsockopt err , send_to_net()!");
		return(-1);
	}

	errcall(DEBUG, "hostaddr[%s]\n",hostaddr);

    	bzero(&sin, sizeof(struct sockaddr_in));
    	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = inet_addr(hostaddr);
      	sin.sin_port=htons((unsigned short)send_port);
	timeout_flag = 0;
	signal ( SIGALRM , catch ) ;
	setjmp ( position ) ;
	if ( timeout_flag == 1 ) {
		close ( sock ) ;
		errcall ( ERROR , "TCP send_to_net() , time_out=%d!",\
			connect_timeout ) ;
		return ( -1 ) ;
	}
	alarm ( connect_timeout ) ;
    	if ( connect(sock, &sin, sizeof(struct sockaddr_in)) < 0) {
		alarm ( 0 ) ;
		close ( sock ) ;
		errcall(ERROR, "TCP Connect %d err , send_to_net()!",send_port);
		return ( -1 ) ;
	}

	i = writen ( sock , senddata , snd_len ) ;
	if ( i < 0 ) {
		alarm ( 0 ) ;
		close ( sock ) ;
		errcall ( ERROR , "TCP Write err , send_to_net()!" ) ;
		return ( -1 ) ;
	}
	close ( sock ) ;
	alarm ( 0 ) ;
	return ( 0 ) ;
}

/* return sock */
listen_port(receive_port)
int	receive_port;
{
struct	sockaddr_in sin , from ;
int 	namelen , sock ;

	sock = socket(AF_INET, SOCK_STREAM, 6);
	if ( sock < 0 ) {
		errcall(ERROR, "TCP sock err , receive_from_net()!");
		exit(1);
    	}

	sin.sin_family=AF_INET; 
      	sin.sin_addr.s_addr= htonl( INADDR_ANY );
      	sin.sin_port=htons((unsigned short)receive_port);
    	if ( bind(sock,&sin, sizeof(struct sockaddr_in)) < 0 ) {
		errcall(ERROR, "TCP bind err , receive_from_net()!");
		exit(1);
    	}

//printf("    bind finish\n");

    	namelen = sizeof(struct sockaddr_in);
   	if (getsockname(sock, &sin, &namelen) < 0) {
		errcall(ERROR, "TCP Getsockname err , receive_from_net()!");
		exit(3);
    	}
//printf("Server bound to port %u 0x%x\n", ntohs(sin.sin_port), sin.sin_port);
        
    	if (listen(sock, 5) < 0) {
		errcall(ERROR, "TCP listen err , receive_from_net()!");
		exit(4);
    	}
//printf("listen finish\n");
	return ( sock );
}

writen(fd,ptr,nbytes)
int fd;
char *ptr;
int nbytes;
{
	int nleft,nwritten;

	nleft=nbytes;
	while(nleft>0){
		nwritten=write(fd,ptr,nleft);
		if(nwritten<=0)
			return(nwritten);

		nleft-=nwritten;
		ptr+=nwritten;
	}
	return(nbytes-nleft);
}

readn(fd,ptr,nbytes)
int 	fd;
char 	*ptr;
int 	nbytes;
{
int 	nleft,nread;

	nleft=nbytes;

	while(nleft>0){
		nread=read(fd,ptr,nleft);
		if(nread<0)
			return(nread);
		else if(nread==0)
			break;
	
		nleft-=nread;
		ptr+=nread;
	}
	return(nbytes-nleft);
}

get_steps_addr( name , address )
char	*name ; 
char	*address ;
{
FILE	*fp ;
char	tmp[120] , tmp1[20] , tmp2[20] ;
int	result = 0 ;

	fp = fopen ("/etc/hosts", "r");

	if (fp == NULL) {
		errcall ( ERROR , "Error Open /etc/hosts" ) ;
		return ( -1 ) ;
	}

	do {
		memset ( tmp , 0 , 120 ) ;
		fgets ( tmp , 120 , fp ) ; 
		sscanf ( tmp , "%s%s" , tmp1 , tmp2 ) ;

		if (!strncmp ( tmp2 , name , strlen(name) ) ) { 
			if ( strlen ( tmp1 ) > 20 ) break ;
			sprintf( address , "%s" ,  tmp1 ) ;
			result ++ ;
		}

	} while ( feof ( fp ) == 0 ) ;
	fclose ( fp ) ;


	if ( result == 0 ) {
		errcall ( ERROR , "%s unknown in /etc/hosts" , name ) ; 
		return ( -1 ) ;
	}
	return ( 0 ) ;
}

catch()
{
	alarm(0);
/*	shutdown(sock,2);*/
	timeout_flag = 1;
	longjmp ( position , 1 ) ;
}

⌨️ 快捷键说明

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