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