Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

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);

163:

164: if ((s = socket(addr->ai_family, addr->ai_socktype,

165: addr->ai_protocol)) < 0)

166: die("socket");

167:

168: if (bind(s, addr->ai_addr, addr->ai_addrlen))

169: die("bind");

170:

171: /* Основной цикл состоит из ожидания tftp-запроса, его обработки

172: и затем ожидания следующего запроса. */

173: while (1) {

174: bytes = recvfrom(s, &packet, sizeof(packet), 0, &from,

175: &fromLen);

176: if (bytes < 0) die("recvfrom");

177:

178: /* Если выполнить разветвление перед вызовом handleRequest и

179: завершить дочерний процесс после возврата функции, то данный

180: сервер будет работать точно как параллельный tftp-сервер */

  • Читать дальше
  • 1
  • ...
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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