LINUXの下でどのようにTCPクライアントとサーバーを作成して、通信を実現します
9603 ワード
TCP
1.socketは、LINUX下のプロセス間通信に属するBSD(socket)ソケットである.同じホスト間のプロセス間通信を実現するか、異なるホスト間のプロセス間通信を実現するか、オペレーティングシステムがアプリケーションに提供するネットワーク通信用のインタフェースでもある.Linuxでは、すべてファイルなので、socketもファイルです.ファイル記述子で操作できます.2.IP番号:ホストの唯一のID.サブネットマスク:パケットが外部ネットワークに送信されるか、内部ネットワークに送信されるかを判断します.IPアドレスは、使用時にバイナリ形式(inet_addr)に変換する必要があります.対応するポート番号変換(htons);IPはホストを区別し、ポート番号はプロセスを区別する.3.クライアントの作成(対応する関数)(1)SOCKETソケット(socket)(2)バインディングアドレス情報(bind)の作成(このステップは省略可能で、システムは自動的に割り当てる)(3)接続要求(connect)(4)送受信メッセージ(send/recv)(5)ソケット(close)4を閉じる.サーバの作成(対応する関数)(1)SOCKETソケットの作成(2)バインドアドレス情報(bind)(サーバ対応IPアドレスとポート番号)(3)リスニングキューの作成(4)接続要求(accept)(5)送受信消息(send/recv)(6)クローズソケットの書き込みが悪い大目に見てほしい.具体的なコードクライアントxldClient.c以下:
#include
#include
#include
#include
#include
#include
int main()
{
// Internet , IP
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(1314);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//1.
int clientId = socket(PF_INET,SOCK_STREAM,0);
if(clientId<0)
{
perror("socket
");
return -1;
}
printf("socket ok
");
//2
int ret = connect(clientId,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret <0)
{
perror("connect
");
close(clientId);
return -1;
}
printf("connect ok
");
// 3
while(1)
{
char buf[1024];
memset(buf,0,1024);
ret = recv(clientId,buf,sizeof(buf),0);
if(ret<0)
{
perror("recv
");
close(clientId);
return -1;
}
printf("received from xldserver:%s
",buf);
memset(buf,0,1024);
printf("xldclient: ");
gets(buf);
if(strcmp(buf,"quit")==0)
{
break;
}
ret=send(clientId,buf,sizeof(buf),0);
if(ret<0)
{
perror("send
");
close(clientId);
return -1;
}
}
//4.
close(clientId);
return 0;
}
次に、サーバの具体的なコードxldServerを示す.c以下
#include
#include
#include
#include
#include
#include
int main()
{
// Internet , IP
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(1314);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//1.
int serverId = socket(PF_INET,SOCK_STREAM,0);
if(serverId<0)
{
perror("serverFd
");
return -1;
}
printf("socket ok
");
//2.
int ret = bind(serverId,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret<0)
{
perror("bind
");
close(serverId);
return -1;
}
printf("bind ok
");
//3.
if(listen(serverId,10)<0)
{
perror("listen
");
close(serverId);
return -1;
}
printf("listening....
");
//4.
int conId=accept(serverId,NULL,NULL);
if(conId<0)
{
perror("accept
");
close(serverId);
return -1;
}
printf("accept ok
");
//5.
while(1)
{
char buf[1024];
memset(buf,0,1024);
printf("please input message (to xldclient)
");
gets(buf);
if(strcmp(buf,"quit")==0)
{
break;
}
ret = send(conId,buf,sizeof(buf),0);
if(ret <0)
{
perror("send
");
close(serverId);
close(conId);
return -1;
}
ret = recv(conId,buf,sizeof(buf),0);
if(ret<0)
{
perror("recv
");
close(serverId);
close(conId);
return -1;
}
printf("from xldclient:%s
",buf);
}
//6.
close(serverId);
close(conId);
return 0;
}