Приложение 2 Вспомогательный код для Windows

Заголовочный файл skel.h

Для компиляции примеров программ на платформе Windows вы можете пользоваться тем же файлом etср.h, что и для UNIX (листинг П1.1). Вся системно зависимая информация находится в заголовочном файле skel.h, версия которого для Windows приведена в листинге П2.1.

Листинг П2.1. Версия skel.h для Windows

skel. h

1 #ifndef _SKEL_H_

2 #define _SKEL_H_

3 /* Версия Winsock. */

4 #include <windows.h>

5 #include <winsock2.h>

6 struct timezone

7 {

8 long tz_minuteswest;

9 long tz_dsttime;

10 };

11 typedef unsigned int u_int32_t;

12 #define EMSGSIZE WSAEMSGSIZE

13 #define INITO init ( argv ) ;

14 #define EXIT(s) do { WSACleanup(); exit( { s ) ); } \

15 while ( 0 )

16 #define CLOSE(s) if ( closesocket( s ) ) \

17 error( 1, errno, "ошибка вызова close")

18 #define errno ( GetLastError() )

19 #define set_errno(e) SetLastError( ( e ) )

20 #define isvalidsock(s) ( ( s ) != SOCKET_ERROR )

21 #define bzero(b,n) memset ( ( b ), 0, ( n ) )

22 #define sleep(t) Sleep( ( t ) * 1000 )

23 #define WINDOWS

24 #endif /* _SKEL_H_ */

skel.h

Функции совместимости с Windows

В листинге П2.2 приведены различные функции, которые использованы в примерах, но отсутствуют в Windows.

Листинг П2.2. Функции совместимости с Windows

wincompat.с

1 ((include <sys/timeb.h>

2 №include "etcp.h"

3 #include <winsock2.h>

4 №define MINBSDSOCKERR ( WSAEWOULDBLOCK )

5 «define MAXBSDSOCKERR ( MINBSDSOCKERR + \

6 ( sizeofl bsdsocketerrs ) / \

7 sizeof( bsdsocketerrs[ 0 ] ) } )

8 extern int sys_nerr;

9 extern char *sys_errlist[];

10 extern char *program_name;

11 static char *bsdsocketerrs[] =

12 {

13 "Resource temporarily unavailable", /* Ресурс временно недоступен. */

14 "Operation now in progress", /* Операция начала выполняться. */

15 "Operation already in progress", /* Операция уже выполняется. */

16 "Socket operation on non-socket", /* Операция сокета не над сокетом. */

17 "Destination address required", /* Нужен адрес назначения. */

18 "Message too long", /* Слишком длинное сообщение. */

19 "Protocol wrong type for socket", /* Неверный тип протокола для сокета. */

20 "Bad protocol option", /* Некорректная опция протокола. */

21 "Protocol not supported", /* Протокол не поддерживается. */

22 "Socket type not supported", /* Тип сокета не поддерживается. */

23 "Operation not supported", /* Операция не поддерживается. */

24 "Protocol family not supported", /* Семейство протоколов не */

/* поддерживается. */

25 "Address family not supported by protocol family", /* Адресное семейство */

/* не поддерживается семейством протоколов*/

26 "Address already in use", /* Адрес уже используется. */

27 "Can't assign requested address", /* He могу выделить затребованный */

/* адрес. */

28 "Network is down", /* Сеть не работает. */

29 "Network is unreachable", /* Сеть недоступна. */

30 "Network dropped connection on reset", /* Сеть сбросила соединение */

/* при перезагрузке. */

31 "Software caused connection abort", /* Программный разрыв соединения. */

32 "Connection reset by peer", /* Соединение сброшено другой */

/* стороной. */

33 "No buffer space available", /* Нет буферов. */

34 "Socket is already connected", /* Сокет уже соединен. */

35 "Socket is not connected", /* Сокет не соединен. */

36 "Cannot send after socket shutdown", /* He могу послать данные после */

/* размыкания. */

37 "Too many references: can't splice", /* Слишком много ссылок. */

38 "Connection timed out", /* Таймаут на соединении. */

39 "Connection refused", /* В соединении отказано. */

40 "Too many levels of symbolic links", /* Слишком много уровней */

/* символических ссылок. */

41 "File name too long", /* Слишком длинное имя файла. */

42 "Host is down", /* Хост не работает. */

43 "No route to host" /* Нет маршрута к хосту. */

44 };

45 void init( char **argv )

46 {

47 WSADATA wsadata;

48 ( program_name = strrchrt argv[ 0 ], '\\' ) ) ?

49 program_name++ : ( program_name = argv[ 0 ] ) ;

50 WSAStartup( MAKEWORDf 2, 2 ), kwsadata );

51 }

52 /* inet_aton - версия inet_aton для SVr4 и Windows. */'

53 int inet_aton( char *cp, struct in_addr *pin )

54 {

55 int re;

56 re = inet_addr( cp );

57 if ( re == -1 && strcmpl cp, "255.255.255.255" ) )

58 return 0;

59 pin->s_addr = re;

60 return 1;

61 }

62 /* gettimeofday - для tselect. * ••

63 int gettimeofday( struct timeval *tvp, struct timezone *tzp )

64 {

65 struct _timeb tb;

66 _ftime( &tb );

67 if ( tvp }

68 {

69 tvp->tv_sec = tb.time;

70 tvp->tv_usec = tb.rr.illitrr. * 1000;

71 }

72 if ( tzp )

73 {

74 tzp->tz_minuteswest = tb.timezone;

75 tzp->tz_dsttirae = tb.dstfiag;

76 }

77 }

78 /* strerror - версия, включающая коды ошибок Winsock. */

79 char *strerror( int err )

80 {

81 if ( err >= 0 && err < sys_nerr !

82 return sys_errlist[ err ] ;

83 else if ( err >= MINBSDSOCKERR && err < MAXBSDSOCKERR )

84 return bsdsocketerrst err - MINBSDSOCKERR ];

85 else if ( err == WSASYSNOTREADY )

86 return "Network subsystem is unusable";

/* СОетевая подсистема неработоспособна. */

87 else if ( err == WSAVERNOTSUPPORTED )

88 return "This version of Winsock not supported";

/* Эта версия Winsock не поддерживается. */

89 else if ( err == WSANOTINITIALISED )

90 return "Winsock not initialized";

/* Winsock не инициализирована. */

91 else

92 return "Unknown error";

/* Неизвестная ошибка. */

93 }

wincompat.с



Опубликовал admin
14 Авг, Суббота 2004г.



Программирование для чайников.