SCTPを使ってみた//WIP

WIPです

本当に申し訳ないですが日本時間には間に合いそうにないです…… すみません(2016/12/6 AM 8:15)

はじめに

この記事はAizuAdventCalenderの記事である。 一つ前は misoton665 さん 一つ後は 0xShone さんです。 よろしくおねがいします。

モチベーション

SCTPと言うプロトコルを知り良さげだと感じたのとLinuxAPIがあると知って やってみたくなった

SCTPとは

Stream Control Transmission Protocol

と言うプロトコル

RFC4960で書かれている . RFC 4960 - Stream Control Transmission Protocol

簡単に説明するとTCPの様な信頼性は担保したいが制約が多すぎるので作られたのがSCTP。
公衆電話通信用に作られたが他の用途でも使うことができる。
TCP,UDPに比べあまりポピュラーではないがLTEトランスポート層でも採用されている。

TCPと比べて良い点

       Features                         TCP     SCTP
multi-streams support                    No     Yes
multi-homing support                     No     Yes
preservation of message boundaries       No     Yes
unordered reliable message delivery      No     Yes

マルチホーミングとは複数の経路を使ってアクセスすることができる機能

使い方

LinuxAPIでサポートされているので普通に利用できる https://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-10

環境

Ubuntu 16.0.4 gcc 5.4.1

下準備

sudo apt install libsctp-dev

簡単な実装(server)

#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/sctp.h>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <errno.h>

#define MAX_LISTEN 10
#define BUFSIZE 2048

int main(){
  int sockfd;
  struct sctp_sndrcvinfo sndrcvinfo;
  sockfd = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
  if(-1 == sockfd) {
    perror("error open socket");
    exit(EXIT_FAILURE);
  }

  struct sockaddr_in server, from;
  memset( &server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl( INADDR_ANY );
  server.sin_port = htons(1204);

  if(-1 == bind(sockfd, (struct sockaddr *)&server, sizeof(server))) {
    perror("error bind");
    close(sockfd);
    exit(EXIT_FAILURE);
  }
  if(-1 == listen(sockfd,  MAX_LISTEN)) {
        exit(EXIT_FAILURE);
  }

  struct sctp_initmsg sctp_init;
  /*
  num_ostreams: number of outbound streams;
  max_instreams: max number of in-bound streams;
  max_attempts: max re-transmissions while establishing an association;
  max_init_timeo: time-out in milliseconds for establishing an association.
  */
  memset( &sctp_init, 0, sizeof(sctp_init));
  sctp_init.sinit_num_ostreams = 10;
  sctp_init.sinit_max_instreams = 10;
  sctp_init.sinit_max_attempts = 0;
  sctp_init.sinit_max_init_timeo = 0;

  int opt = 1;
  setsockopt(sockfd, IPPROTO_SCTP, SCTP_INITMSG, &sctp_init, sizeof(sctp_init));

  if(listen(sockfd, 1) < 0) {
    perror("error listen for connection");
    exit(EXIT_FAILURE);
  }

  const char* message = "Hello world";
  char buffer[BUFSIZE];

  printf("start listen loop\n");
  int msg_flags;
  while(1) {
    int resv_size =  sctp_recvmsg(
      sockfd,
      buffer,
      strlen(buffer),
      (struct sockaddr *)&from, // sockaddr * from
      &len,            // socklen_t * fromlen
      &sndrcvinfo,             // struct sctp_sndrcvinfo
      &msg_flags               // int * msg_flags
    );
    if(-1 == resv_size) {
      perror("error receiving message");
      exit(EXIT_FAILURE);
    }

    buffer[resv_size] = 0;

    int ret = sctp_sendmsg(
      sockfd,
      (void *)buffer,
      (size_t)strlen(buffer),
      NULL, // struct sockaddr *to
      0,    // socklen_t tolen
      0,    // uint32_t ppid
      0,    // uint32_t flags
      0,    // uint16_t stream_no
      0,    // uint32_t timetolive
      0     // uint32_t context
    );

    if(-1 == ret) {
      perror("error sending message: ");
      exit(EXIT_FAILURE);
    }
  }

  return 0;
}

コンパイル

gcc sctp.c  -lsctp

進捗

error open socket: Socket type not supported

Ref

http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/other/rfc3286.txt マルチホーミング

http://tech.queryhome.com/44164/what-is-the-main-advantage-of-using-sctp-over-tcp-ip

大学院入試辛かった

結果的にアレだったがどうせなのでメモしておく。
自分は入試に向かないなという気持ちで胸がいっぱい

英語

大学的に大丈夫だろうと思いつつ不安だったので一工夫した。
具体的には東山奈央さんの声を耳に馴染ませ全ての英文が東山奈央さんの声で再生されるようにした。
これにより英文を読むことで気分がよくなる->英文を読みたくなるの流れをつくっていった。
その結果入試とは関係無いが英語が好きになった。イギリスに行きたい。

ポイントとして

「きんいろモザイク」と英語レッスン

「きんいろモザイク」と英語レッスン

これを読むと九条カレンちゃんで脳内再生されるのでとっかかりとしてはいいと思う。

www.marine-e.net

これも定期的に聞こう。

実技(プログラミング)

とりあえずC++書いた。実技の問題は特に難しいアルゴリズムというより
なんか1つできる言語あるんすか?てなのを調べるのが目的だと勝手に感じた。
普段書いてる言語を使えるようにしておけばいいと思う。(ファイル入出力とかスレッドとか痒いところが出る)
自分のPCを使うことができる利点として彼女たちと一緒に試験を受けられるということがある。

f:id:mizukisonoko:20160908225314j:plain しゅき〜❤️

筆記(情報工学)

前日にMAに参加してて割と対策していなかった。

hacklog.jp

hacklog.jp MAではとりあえず仮想通貨システムをブロックチェーンで作った。
東北予選で優勝!wだったので東北代表?。スフィアかわいい。

今年の試験の内容はロボット工学と論理回路周り。
会津大の授業で履修した内容がそっくりそのまま出てたのでアド。

面接

1 vs 14てめげるわぁ?(末原恭子 in 咲-saki-)
という感じ。第二志望の方は適当に書いていたので理由聞かれて気まずくなった。

シンフォギアライブ2016の円盤を手に入れることができたので面接頑張れた

感想

外部進学なので待ち時間は回線がなく辛い。
今回はiPad pro+iPencilを持って行ったのが功をなして暇をつぶせたのがアド。
当然だが試験時間はオフラインなのでかなりしんどい。合計10時間ぐらいオフラインなので辛い。
入試嫌い。

membersrvcをsupervisorで動かす

hyperledger/fabricの証明書サーバー動かすメモ

続きを読む

hyperledger/fabricをEC2で動かす

SPAJAM仙台予選でブロックチェーンでアセット監視システムを作ったが
その時hyperledger/fabricをEC2で動かそうとして結構はまったのでセットアップをまとめた。

続きを読む

GitHubで大学課題を管理した

さいしょに

私の通う大学には”言語処理系論”と言う講義がある。
簡単に内容を説明すると言語処理の手順を学びつつ自作言語と自作コンパイラを作っていく面白い授業だ。
なお、この講義の演習はチーム制であり、提出方法は学内の自分のホームに作った専用フォルダに指定時間内に置いておくといううものである。

今回、GitHubのprivate repoが大幅値下げされたことに伴って課題をGitHubを使って提出する方法を共有しようと思う

背景

  • 自分含め3人のチーム開発
  • 提出先は~/lp/ex**, testdir内に入ってmake,testall.shをしてその結果ACなら問題無い

下準備1 GitHubAccess Tokenを取る

curl -u 'MizukiSonoko' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations

下準備2 各種変数

Repository名を入れる

REPO_NAME="LanguageProcessingInUoA"

GithubnのAPIKeyを入れる

API_KEY="RabbitHouseTeaParty"

Scriptを書く

gist1eee3bd7b12882bbff97bb78e58988e2

 使い方

./deploy.sh ex04

的な

運用

とりあえずdevで開発、testが通ったらmasterにPRしていった。
マージして、上のscriptを走らせてたら無事提出できてたっぽい。

結果

Bもらった!!!!!

今後

もう課題提出の講義が無いので後輩にはtravisとか色々導入してより良い課題提出環境を作っていってほしい。

automatorでコンテクストメニューにSlack共有作ったら捗った

f:id:mizukisonoko:20160510221050p:plain
automator開く -> サービスを新規作成

ユーティリティ -> シェルスクリプトを実行
f:id:mizukisonoko:20160510221412p:plain shellscriptを書く。SlackのIncoming WebHooksを使う

curl -X POST --data-urlencode "payload={\"channel\": \"#favorite\", \"username\": \"webhookbot\", \"text\": \"http://$1\", \"icon_emoji\":\":star:\"}" https://hooks.slack.com/services/**chino**cocoa**rize

サービスをインストールする的なダイアログが出る。インストールする。

コンテクストメニューに追加されているので使う

f:id:mizukisonoko:20160510221520p:plain f:id:mizukisonoko:20160510221409p:plain

捗った

ToDo

URLに対応

pythonの組み込み関数をいじくってみた。

>>> bin(-12)
'-0b1100'

追記

Even if this was a good idea, it's too late to change the behavior of the builtin function.

おわり

続きを読む