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

на главную

Жанры

Разработка приложений в среде 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);

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

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Темный Охотник

Розальев Андрей
1. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Охотник

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

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

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

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...