Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

 58: break;

 59: }

 60:

 61: /* 2 байта кода операции, 2 байта кода ошибки, сообщение и '\0' */

 62: size = 2 + 2 + strlen(err.u.error.message) + 1;

 63: if (send(s, &err, size, 0) != size)

 64: die("erarorsend");

 65: }

 66:

 67: void handleRequest(struct addrinfo tftpAddr,

 68: struct sockaddr remote, int remoteLen,

 69: struct tftpPacket request) {

 70: char * fileName;

 71: char * mode;

 72: int fd;

 73: int s;

 74: int size;

 75: int sizeRead;

 76: struct tftpPacket data, response;

 77: int blockNum = 0;

 78:

 79: request.opcode = ntohs(request.opcode);

 80: if (request.opcode != RRQ) die("неверный
код операции");

 81:

 82: fileName = request.u.bytes;

 83: mode = fileName + strlen(fileName) + 1;

 84:

 85: /* здесь поддерживается только режим bin */

 86: if (strcmp(mode, "octet")) {

 87: fprintf(stderr, "неверный режим %s\n", mode);

 88: exit(1);

 89: }

 90:

 91: /* требуется передача при помощи сокета того же семейства и типа,

 92: с которым мы начинали */

 93: if ((s = socket(tftpAddr.ai_family, tftpAddr.ai_socktype,

 94: tftpAddr.ai_protocol)) < 0)

 95: die("send socket");

 96:

 97: /* установить удаленный конец сокета на адрес, который

 98: инициирует данное соединение */

 99: if (connect(s, &remote, remoteLen))

100: die("connect");

101:

102: if ((fd = open(fileName, O_RDONLY)) < 0) {

103: sendError(s, FILE_NOT_FOUND);

104: close(s);

105: return;

106: }

107:

108: data.opcode = htons(DATA);

109: while ((size = read(fd, data.u.data.bytes, 512)) > 0) {

110: data.u.data.block = htons(++blockNum);

111:

112: /* размер составляют 2 байта (код
операции), 2 байта (номер блока) и данные*/

113: size += 4;

114: if (send(s, &data, size, 0) != size)

115: die("data send");

116:

117: sizeRead = recv(s, &response, sizeof(response), 0);

118: if (sizeRead < 0) die("recv ack");

119:

120: response.opcode = ntohs(response.opcode);

121: if (response.opcode != ACK) {

122: fprintf(stderr, "непредвиденный код операции в отклике\n");

123: exit(1);

124: }

125:

126: response.u.ack.block = ntohs(response.u.ack.block);

127: if (response.u.ack.block != blockNum) {

128: fprintf(stderr, "получено подтверждение неверного блока\n");

129: exit(1);

130: }

131:

132: /* если блок, который мы только что отправили, содержит

133: меньше 512 байт, то задача выполнена */

134: if (size < 516) break;

135: }

136:

137: close(s);

138: }

139:

140: int main(int argc, char ** argv) {

141: struct addrinfo hints, * addr;

142: char * portAddress = "tftp";

143: int s;

144: int rc;

145: int bytes, fromLen;

146: struct sockaddr from;

147: struct tftpPacket packet;

148:

149: if (argc > 2) {

150: fprintf(stderr, "использование: tftpserver [порт]\n");

151: exit(1);

152: }

153:

154: if (argv[1]) portAddress = argv[1];

155:

156: memset(&hints, 0, sizeof (hints));

157:

158: hints.ai_socktype = SOCK_DGRAM;

159: hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;

160: if ((rc = getaddrinfo(NULL, portAddress, &hints, &addr)))

161: fprintf(stderr, "сбой поиска порта %s\n",

162: portAddress);

Поделиться:
Популярные книги

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста