176 lines
7.2 KiB
C
Executable File
176 lines
7.2 KiB
C
Executable File
#ifdef TCP_STACK
|
|
|
|
#define TCP_SOCKET 1 /* Status: Socket erstellen */
|
|
#define TCP_BIND 2 /* Status: Socket binden. */
|
|
#define TCP_LISTEN 3 /* Status: Socket auf Listen setzen.*/
|
|
#define TCP_CONNECTED 4 /* Status: Es gibt eine Verbindung. */
|
|
|
|
#define TCP_CLOSED 0 /* Socket leeren/entsorgen. */
|
|
#define TCP_SYNCON 1 /* Verbindungsaufbau bestaetigen. */
|
|
#define TCP_ESTABLISHED 2 /* Status Stabil . */
|
|
#define TCP_ACKSENT 3 /* ACK-Bestaetigung senden. */
|
|
#define TCP_PSHSENT 4 /* Frame an den Nachbarn schicken. */
|
|
#define TCP_ACKWAIT 5 /* Warte auf ACK-Bestaetigung. */
|
|
#define TCP_CLOSE 6 /* Status schliessen. (7 bis 15) */
|
|
#define TCP_FINSENT 7 /* Socket sofort schliessen. */
|
|
#define TCP_FINWAIT 8 /* Warte auf FIN & ACK-Bestaetigung. */
|
|
#define TCP_FINACKWAIT 9 /* Warte auf ACK-Bestaetigung. */
|
|
#define TCP_ACKWAITFIN 10 /* Warte auf ACK, danach FIN senden. */
|
|
#define TCP_PSHWAITFIN 11 /* Sende alle offenstehende Packete. */
|
|
#define TCP_PSHSENTFIN 12 /* Naechstes Packet senden. */
|
|
#define TCP_FINSENTCLOSED 13 /* Nach ACK-Bestaetigung, FIN & ACK-Senden.*/
|
|
#define TCP_ACKWAITCLOSED 14 /* Warte auf ACK-Bestaetigung, Socket entf.*/
|
|
#define TCP_RSTSENT 15 /* Verbindung zuruecksetzen. */
|
|
|
|
#ifndef SOCK_STREAM
|
|
#define SOCK_STREAM 1 /* stream socket */
|
|
#endif
|
|
|
|
#ifndef AF_INET
|
|
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
|
|
#endif
|
|
|
|
#ifndef INADDR_ANY
|
|
#define INADDR_ANY (ULONG)0x00000000
|
|
#endif
|
|
|
|
#define NUM_SOCKETS 32 /* Max. Socket's */
|
|
|
|
typedef unsigned int Socklen_t;
|
|
|
|
typedef struct _fd_set
|
|
{
|
|
unsigned int fd_count; /* how many are SET? */
|
|
Socklen_t fd_array[FD_SETSIZE]; /* an array of SOCKETs */
|
|
} Fd_set;
|
|
|
|
#define FD_SET_T(fd, set) do { \
|
|
Socklen_t __i; \
|
|
for (__i = 0; __i < ((Fd_set *)(set))->fd_count; __i++) { \
|
|
if (((Fd_set *)(set))->fd_array[__i] == (fd)) { \
|
|
break; \
|
|
} \
|
|
} \
|
|
if (__i == ((Fd_set *)(set))->fd_count) { \
|
|
if (((Fd_set *)(set))->fd_count < FD_SETSIZE) { \
|
|
((Fd_set *)(set))->fd_array[__i] = (fd); \
|
|
((Fd_set *)(set))->fd_count++; \
|
|
} \
|
|
} \
|
|
} while(0)
|
|
|
|
#define FD_ZERO_T(set) (((Fd_set *)(set))->fd_count=0)
|
|
|
|
extern BOOLEAN GetSocket(Socklen_t, Fd_set *);
|
|
#define FD_ISSET_T(fd, set) GetSocket((Socklen_t)(fd), (Fd_set *)(set))
|
|
|
|
struct In_addr {
|
|
union {
|
|
struct { UBYTE s_b1,s_b2,s_b3,s_b4; } S_un_b;
|
|
struct { UWORD s_w1,s_w2; } S_un_w;
|
|
ULONG _S_addr;
|
|
} _S_un;
|
|
#define _S_addr _S_un._S_addr
|
|
/* can be used for most tcp & ip code */
|
|
};
|
|
|
|
struct Sockaddr_in
|
|
{
|
|
short sin_family;
|
|
UWORD sin_port;
|
|
struct In_addr sin_addr;
|
|
char sin_zero[8];
|
|
};
|
|
|
|
struct Sockaddr
|
|
{
|
|
UWORD sa_family; /* address family */
|
|
char sa_data[14]; /* up to 14 bytes of direct address */
|
|
};
|
|
|
|
struct Timeval
|
|
{
|
|
long tv_sec; /* seconds */
|
|
long tv_usec; /* and microseconds */
|
|
};
|
|
|
|
typedef struct tsocket /* Struktur Socketliste */
|
|
{
|
|
struct tsocket *next;
|
|
struct tsocket *prev;
|
|
#ifdef BUFFER_DEBUG
|
|
UBYTE owner; /* Muss an 9. Bytestelle stehen */
|
|
#endif
|
|
ACK RecvNext; /* Naechstes Frame Empfangen. */
|
|
SEQ SendNext; /* Naechstes Frame Senden. */
|
|
ACK SendUnacked; /* Noch nicht gesende Frames. */
|
|
unsigned long IpDest; /* IP-Adresse vom Nachbarn. */
|
|
int Socket; /* Socket. */
|
|
int Domain; /* Domain. */
|
|
int Type; /* Protokoll-Typ (TCP oder UDP). */
|
|
int PacNum; /* Frame-Zaehler. */
|
|
/* TCP-Header. */
|
|
unsigned DestPort; /* Destination-Port */
|
|
unsigned LocalPort; /* Local-Port setzen. */
|
|
unsigned short MaxListen; /* Groesse der Warteschlange. */
|
|
unsigned short Listen; /* Momentan in der Warteschlange. */
|
|
unsigned char UrgPointer; /* Urgent Pointer */
|
|
UBYTE State; /* Socket-Status. */
|
|
UBYTE TState; /* Socket-Status. */
|
|
UBYTE tos; /* Type of service */
|
|
BOOLEAN RecvEvent; /* Select markieren, Empfang. */
|
|
BOOLEAN SendEvent; /* Select markieren, Senden. */
|
|
} TSOCKET;
|
|
|
|
extern TSOCKET sockets[NUM_SOCKETS];
|
|
|
|
extern int Socket(int, /* Ein socket anlegen. */
|
|
int,
|
|
int);
|
|
|
|
extern int Bind (int, /* Socket binden. */
|
|
struct Sockaddr *,
|
|
Socklen_t);
|
|
|
|
extern int Listen(int, /* Lausche auf Socket. */
|
|
int);
|
|
|
|
extern int Select(int, /* Den Socket auf Aktivitaet pruefen. */
|
|
Fd_set *,
|
|
Fd_set *,
|
|
Fd_set *,
|
|
struct Timeval *);
|
|
|
|
extern int Accept(int , /* Verbindungsbau annehmen/ablehnen. */
|
|
struct Sockaddr *,
|
|
Socklen_t *);
|
|
|
|
extern int Recv (int , /* Daten Empfangen. */
|
|
char *,
|
|
int ,
|
|
int);
|
|
|
|
extern int Send (int , /* Daten Senden. */
|
|
char *,
|
|
int,
|
|
int);
|
|
|
|
extern void Close (int); /* Socket schliessen. */
|
|
|
|
|
|
extern int SearchSock(int); /* Den Socket aus der Socketliste suchen. */
|
|
extern void DelSocket(int); /* Socket als unbenutzt markieren. */
|
|
|
|
/* konvertiert die Kurzganzzahl hostshort Rechner- nach Netzwerk-Byteordnung. */
|
|
extern unsigned short Htons(unsigned short);
|
|
/* konvertiert die Kurzganzzahl netshort von Netzwerk-nach Rechner-Byteordnung*/
|
|
extern unsigned short Ntohs(unsigned short);
|
|
/* konvertiert die Langganzzahl hostlong von Rechner-nach Netzwerk-Byteordnung*/
|
|
extern unsigned long Htonl(unsigned long);
|
|
/* konvertiert die Langganzzahl netlong von Netzwerk- nach Rechner-Byteordnung*/
|
|
extern unsigned long Ntohl(unsigned long);
|
|
|
|
#endif /* TCP_STACK. */
|
|
|
|
/* End of include/l3sock.h. */
|