TCP通信プログラム 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ TCP通信プログラム(基本接続) #include <stdio.h> #include <strings.h> switch (arg[3][0]){ case 'b': if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); return -1; } listen(sock,8); sock2=accept(sock,(struct sockaddr *)&saddr2,&saddr2_len); printf("connected from %s.\n",inet_ntoa(saddr2.sin_addr)); break; #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> main(narg,arg) int narg; char **arg; { int sock,sock2,saddr2_len; int s_addr; unsigned short port; struct sockaddr_in saddr,saddr2; case 'c': if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPconnect "); return -1; } getchar(); break; } s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); bzero(&saddr2,sizeof(struct sockaddr_in)); close (sock); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); } sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 情報ネットワーク 2 TCP と UDP の違い(bind) • UDP: – bind したソケットIDから直接受信を行う • TCP – bind したソケットはID は accept により、接続要 求受け付けに用いられ、accept 後、通信用のソ ケットIDが生成され、その ID を用いて通信が行 われる。 情報ネットワーク 3 bind で与えるべきIPアドレス saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = s_addr; saddr.sin_port = htons(port); sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(bind(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPbind "); 接続は誰が行うかわからない。つまり、 予想はできないし、指 定できる場合は少ない。そのため、誰とでも接続が行えるよう に 0.0.0.0 を指定する。ただし、サービスを識別するための ポート番号は適切な値にする必要がある。 情報ネットワーク 4 TCP と UDP の違い(connect) • UDP: – 通信相手が bind していなくても connect の発行 は可能 • TCP – connect するためには、通信相手が先に予め、 bind/listen/accept しておく必要がある。 情報ネットワーク 5 送信、受信する関数は同じ • TCP も UDP と同じく write() 関数によるソケ ットへの書き込みで送信を行い、read()関数 によるソケットからの読み出しで受信を行う。 – ただし、TCP は bind したソケットIDではなく、 accept したソケットID。 情報ネットワーク 6 課題 1. UDP の宿題で作成した EOF で通信が終了 するプログラムを TCP バージョンに変更せ よ。 2. ファイルを転送するプログラムを作成せよ。 – 数Mbyteのファイルの転送が正しく行えるか、確 認せよ。 情報ネットワーク 7
© Copyright 2024 ExpyDoc