socketネットワークプログラミング、基礎関数の使用と注意すべき点

2316 ワード

まず、ネットワークプログラミングでも他のプログラミングでも役立つテクニックを書きます.
ラップ関数:
int Socket(int domain,int type,int protool){
   int sockfd;
   if((sockfd=socket(domain,type,protool))<0){
      perror("socket error!");
      exit(1);
   }
}

ラップ関数の場合、最も主要な点は、等しい番号の優先度が最も低いことです.そのため、比較するときにカッコを付ける必要があります.そうしないと、socket operation on non-socketのエラーが発生します.この点は深く体得している.
では、今から基礎的なsocketプログラミングを書きます.
クライアント側でもサーバ側でも、まずsocketソケットを作成します.
socket関数のパラメータは次のとおりです.
int socket(int domain,int type,int protool);

最初のパラメータの意味は、どのようなプロトコルを使用するかを表し、基本的にはAF_を使用することが多い.INETとAF_INET 6、一つはIPV 4、一つはIPV 6、そしてAF_LOCAL,unixドメインソケット,AF_ROUTE,ルーティングソケット,AF_KEY、鍵ソケット.
2番目のパラメータには、どのようなタイプのソケットが使用されているかを示すSOCK_が含まれています.STREAM,バイトストリームソケット,SOCK_DGRAM,データレポートソケット,SOCK_RAW、オリジナルソケット.SOCK_SEQACK ET秩序化パケットソケット.
一般的に特殊な場合を除いて、前の設定がすでに設定されている限り、このパラメータは基本的に0を設定します.
次に、サーバ側でbindソケットを操作します.
bindソケットの前にサーバのsockaddr構造を設定します.
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AFNET;
servaddr.sin_addr.s_addr=htonl(INADDRINY);
servaddr.sin_port=htons(PORT);

まずアドレスをクリアし、最初にプロトコルを設定し、IPアドレスを設定し、ポートを設定します.
int bind(int sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));

 
if((bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
   perror("bind error!");
   exit(1);
}

次はbind関数のエラーラップ関数です.
1番目のパラメータはソケットで、2番目のパラメータはsockaddrに強制的に変換されたsockaddr_です.In構造のservaddr,3番目のパラメータは
bindが完了するとリスニングされ、listenが続きます.
int listen(int sockfd,int bakclog);

1番目のパラメータはソケットで、2番目はソケットキューの最大接続数です.
そしてループ待ちに入り、accept関数は、クライアントがconnectを完了すると、acceptが受信し、接続が確立され、そうでなければaccept関数にブロックされます.
次はaccept関数です.
socklen_t clilen;
clilen=sizeof(cliaddr);
accept(sockfd,(struct sockaddr*)&cliaddr,&clilen);

クライアントの鍵はsocketソケットを作成することであり、バインドする必要はなく、傍受する必要はありませんが、サーバ側のアドレスservaddrを設定します.次に、サーバ側に接続します.
connect(int sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr);

接続が確立されました.もちろん、acceptとconnectでは、複数のクライアント、1つのサーバ、どのようにaccept、listenキューで準備されているクライアントを見つけるかなど、議論できることがたくさんあります.
それからサーバーとクライアントの間のデータの送信と受信の関数もあって、私はブログを置いて書きました.