root/lang/c/friendsd/tcpcalls.c @ 32953

Revision 15618, 4.0 kB (checked in by kazuho, 5 years ago)

initial import

Line 
1#include "tcpcalls.h"
2
3int create_service( ushort port ) {
4  struct sockaddr_in server_sockaddr;
5  int server_socket;
6 
7  printf( "A" ); fflush( stdout );
8  bzero( &server_sockaddr, sizeof( server_sockaddr ) );
9  printf( "A" ); fflush( stdout );
10  server_sockaddr.sin_port = htons( port );
11  printf( "A" ); fflush( stdout );
12  server_sockaddr.sin_family = AF_INET;
13  printf( "A" ); fflush( stdout );
14  server_sockaddr.sin_addr.s_addr = htonl( INADDR_ANY );
15  printf( "A" ); fflush( stdout );
16  server_socket = socket( AF_INET, SOCK_STREAM, 0 );
17  printf( "A" ); fflush( stdout );
18  if( server_socket < 0 ) {
19    perror( "socket" );
20    return( -1 );
21  }
22  printf( "A" ); fflush( stdout );
23  if( bind( server_socket, &server_sockaddr, sizeof( server_sockaddr ) ) < 0 ) {
24    perror( "bind" );
25    close( server_socket );
26    return( -1 );
27  }
28  printf( "A" ); fflush( stdout );
29  listen( server_socket, 5 );
30  printf( "A" ); fflush( stdout );
31  return( server_socket );
32}
33
34static sigjmp_buf envOnCT; static int savemaskOnCT;
35
36void onConnectTimeout() {
37}
38
39int connect_to_server( char *name, ushort port, int timeout_val ) {
40  struct sockaddr_in server_sockaddr;
41  struct hostent *server_hostent;
42  int toserver_socket, i;
43  char str[ 255 ];
44  ushort opcode;
45  unsigned long hostaddr;
46  char server_name[ 255 ];
47 
48  if( ( name == NULL ) || ( *name == 0 ) ) {
49    strcpy( server_name, "localhost" );
50  } else
51    strcpy( server_name, name );
52 
53  bzero( &server_sockaddr, sizeof( server_sockaddr ) );
54 
55  hostaddr = inet_addr( server_name );
56  if( ( long )hostaddr != ( long )-1 ) {
57    bcopy( &hostaddr, &server_sockaddr.sin_addr, sizeof( hostaddr ) );
58  } else {
59    server_hostent = gethostbyname( server_name );
60    if( server_hostent == NULL )
61      return( -1 );
62    bcopy( server_hostent->h_addr, &server_sockaddr.sin_addr, server_hostent->h_length );
63  }
64  server_sockaddr.sin_family = AF_INET;
65  server_sockaddr.sin_port = htons( port );
66  if( ( toserver_socket = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
67    return( -1 );
68 
69  signal( SIGALRM, onConnectTimeout );
70  alarm( timeout_val );
71  if( connect( toserver_socket, &server_sockaddr, sizeof( server_sockaddr ) ) < 0 )
72    goto ON_FAIL;
73  alarm( 0 );
74  signal( SIGALRM, SIG_IGN );
75  return( toserver_socket );
76 ON_FAIL:
77  alarm( 0 );
78  signal( SIGALRM, SIG_IGN );
79  close( toserver_socket );
80  return( -1 );
81}
82
83int read_short( int sock, ushort *num ) {
84  char tmp[ 2 ];
85  int result, len;
86 
87  *num = ( short )0;
88  len = 0;
89  while( len < 2 ) {
90    result = read( sock, tmp, 2 - len );
91    if( result == -1 ) {
92      if( errno == EAGAIN || errno == EWOULDBLOCK )
93        continue;
94    } else if( result <= 0 )
95      return( result );
96    len += result;
97  }
98 
99  *num = ntohs( *( ushort * )tmp );
100  return( 2 );
101}
102
103int write_short( int sock, ushort num ) {
104  char tmp[ 2 ];
105  int result;
106 
107  *( short * )tmp = htons( num );
108  result  = write( sock, tmp, 2 );
109  if( result <= 0 )
110    return( result );
111  if( result == 1 ) {
112    result = write( sock, tmp +1, 1 );
113    if( result <= 0 )
114      return( result );
115  }
116  return( result );
117}
118
119int read_blk( int sock, ushort *opcode, char *str ) {
120  char *ptr = str;
121  int result;
122  ushort block_len, b;
123 
124  if( ( result = read_short( sock, opcode ) ) <= 0 )
125    return( result );
126  if( ( result = read_short( sock, &block_len ) ) <= 0 )
127    return( result );
128  b = block_len;
129 
130  while( block_len > 0 ) {
131    result = read( sock, ptr, block_len );
132    if( result == -1 ) {
133      if( errno == EAGAIN || errno == EWOULDBLOCK )
134        continue;
135    } else if( result <= 0 )
136      return( result );
137    block_len -= result;
138    ptr += result;
139  }
140  return( b );
141}
142
143int write_blk( int sock, ushort opcode, int block_len, char *str ) {
144  char *ptr = str;
145  int result;
146 
147  if( ( result = write_short( sock, opcode ) ) <= 0 )
148    return( result );
149  if( ( result = write_short( sock, block_len ) ) <= 0 )
150    return( result );
151 
152  while( block_len > 0 ) {
153    result = write( sock, ptr, block_len );
154    if( result <= 0 )
155      return( result );
156    block_len -= result;
157    ptr += result;
158  }
159  return( 1 );
160}
Note: See TracBrowser for help on using the browser.