プロトコル解説
昨日の UDP Reflector のプロトコル解説をざっと書いてみました。かぴのすけへの返事でも書きましたが、このページにあるアーカイブには .class、.java 両方とも含まれていますので、実際のソースコードを読んで動きを確認したい方はそちらをご参照ください。
下記プログラムを実行して www.digitune.org の 15315 番ポート宛に UDP パケットを送信してくれる人募集(笑。出来ればそのときの送受信パケットダンプもあると助かるんですが…。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/uio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/errno.h>
extern int h_errno;
int main(int argc, char *argv[])
{
int sd;
char buf[256];
int messagelength;
struct sockaddr_in server;
struct hostent *he;
/* 引数のエラー処理 */
if(argc != 4){
fprintf(stderr, "usage: %s SERVER_NAME SERVER_PORT MESSAGE\n", argv[0]);
exit(1);
}
/* socketの生成。SOCK_DGRAMがudp用 */
sd = socket(AF_INET, SOCK_DGRAM, 0) ;
if(sd < 0){
perror("socket: ");
exit(1);
}
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
/* gethostbyname による名前引き */
he = gethostbyname(argv[1]);
if(he == NULL){
fprintf(stderr, "gethostbyname() failed: %s\n", hstrerror(h_errno));
exit(1);
}
memcpy((void *) &(server.sin_addr), (void *) he->h_addr, he->h_length);
/* バッファの初期化 */
memset(buf,0,sizeof(buf));
strncpy(buf, argv[3], sizeof(buf) - 1);
messagelength = strlen(buf);
/* サーバーへの送信 */
if(sendto(sd, buf, messagelength, 0,
(struct sockaddr *) &server, sizeof(server)) == -1){
perror("sendto");
exit(1);
}
memset(buf,0,sizeof(buf));
buf[1] = 0x10;
/* サーバーへの送信 (2) */
if(sendto(sd, buf, 3, 0,
(struct sockaddr *) &server, sizeof(server)) == -1){
perror("sendto");
exit(1);
}
close(sd);
exit(0);
}
referer bomb
昨日の日記の referer がエッチサイトで山盛りになってますね(笑。なんだかなぁ。