情報ネットワーク

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