岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ TCP通信プログラム 岡村耕二 http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/ 情報ネットワーク
TCP通信プログラム(基本接続) 情報ネットワーク #include <stdio.h> #include <strings.h> #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; s_addr=inet_addr(arg[1]); port=atoi(arg[2]); bzero(&saddr,sizeof(struct sockaddr_in)); bzero(&saddr2,sizeof(struct sockaddr_in)); 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); 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; case 'c': if(connect(sock, (struct sockaddr *)&saddr,sizeof(saddr)) < 0){ perror("TCPconnect "); getchar(); close (sock); 情報ネットワーク
TCP と UDP の違い(bind) UDP: TCP bind したソケットIDから直接受信を行う bind したソケットはID は accept により、接続要求受け付けに用いられ、accept 後、通信用のソケットIDが生成され、その ID を用いて通信が行われる。 情報ネットワーク
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 を指定する。ただし、サービスを識別するためのポート番号は適切な値にする必要がある。 情報ネットワーク
TCP と UDP の違い(connect) UDP: TCP 通信相手が bind していなくても connect の発行は可能 connect するためには、通信相手が先に予め、 bind/listen/accept しておく必要がある。 情報ネットワーク
送信、受信する関数は同じ TCP も UDP と同じく write() 関数によるソケットへの書き込みで送信を行い、read()関数によるソケットからの読み出しで受信を行う。 ただし、TCP は bind したソケットIDではなく、accept したソケットID。 情報ネットワーク
課題 UDP の宿題で作成した EOF で通信が終了するプログラムを TCP バージョンに変更せよ。 ファイルを転送するプログラムを作成せよ。 数Mbyteのファイルの転送が正しく行えるか、確認せよ。 情報ネットワーク