Cにおけるsocketの基本使用

5618 ワード

一般的な関数:
作成
関数プロトタイプ:int socket(int domain,int type,int protocol);パラメータの説明:
  • domain:プロトコルドメイン、プロトコルファミリーとも呼ばれる.よく使われるプロトコルファミリーはAF_INET、AF_INET6、AF_LOCAL(またはAF_UNIX、UnixドメインSocket)、AF_ROUTEなど.プロトコルファミリーはsocketのアドレスタイプを決定し、通信にはAF_などの対応するアドレスを採用しなければならない.INETはipv 4アドレス(32ビット)とポート番号(16ビット)の組み合わせ、AF_UNIXはアドレスとして絶対パス名を使用することを決定した.
  • type:Socketタイプを指定します.よく使うソケットタイプはSOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQACK ETなど.ストリーミングソケット(SOCK_STREAM)は、接続向けTCPサービスアプリケーションのための接続向けソケットである.データグラムSocket(SOCK_DGRAM)は、無接続のUDPサービスアプリケーションに対応する無接続のSocketである.
  • protocol:プロトコルを指定します.共通プロトコルはIPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPCなどは、それぞれTCPトランスポートプロトコル、UDPトランスポートプロトコル、STCPトランスポートプロトコル、TIPCトランスポートプロトコルに対応する.注意:1.typeとprotocolはSOCK_のように勝手に組み合わせてはいけない.STREAMとIPPROTO_は不可UDPグループ.3番目のパラメータが0の場合、2番目のパラメータタイプに対応するデフォルトプロトコルが自動的に選択されます.2.WindowsSocketのprotocolパラメータにIPPROTO_が存在しないSTCP
  • 戻り値:呼び出しが成功すると新しく作成したソケットの記述子が返され、失敗するとINVALID_が返されます.SOCKET(Linuxで失敗して-1を返します).ソケット記述子は整数タイプの値です.各プロセスのプロセス空間には、ソケット記述子とソケットデータ構造の対応関係が格納されたソケット記述子テーブルがあります.この表には、新しく作成したソケットの記述子を格納するフィールドと、ソケットデータ構造のアドレスを格納するフィールドがあり、ソケット記述子に基づいて対応するソケットデータ構造を見つけることができます.各プロセスには、独自のプロセススペースにソケット記述子テーブルがありますが、ソケットデータ構造はオペレーティングシステムのカーネルバッファにあります.

  • バインディング
    関数のプロトタイプ:
    int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len);
    

    パラメータの説明:
  • socket:ソケット記述子です.
  • address:結合するアドレスとポート番号を含むsockaddr構造ポインタです.
  • address_len:addressバッファの長さを決定します.
  • 戻り値:関数が正常に実行された場合、戻り値は0、そうでなければSOCKET_ERROR.

  • じゅしん
    関数のプロトタイプ:
    int recv(SOCKET socket, char FAR* buf, int len, int flags);
    

    パラメータの説明:
  • socket:接続されたソケットインタフェースを識別する記述語.
  • buf:データを受信するためのバッファ.
  • len:バッファ長.
  • flags:呼び出し方法を指定します.値:MSG_PEEKは現在のデータを表示し、データはバッファにコピーされますが、入力キューから削除されません.MSG_OOBは帯域外データを処理する.
  • 戻り値:エラーが発生しない場合、recv()は読み込まれたバイト数を返します.接続が中止された場合は、0を返します.そうでなければSOCKET_に戻りますERRORエラー、アプリケーションはWSAGEtLastError()を使用して対応するエラーコードを取得できます.関数プロトタイプ:
  • ssize_t recvfrom(int sockfd, void buf, int len, unsigned int flags, struct socketaddr* from, socket_t* fromlen);
    

    パラメータの説明:
  • sockfd:接続されたソケットインタフェースを識別する記述語.
  • buf:データバッファを受信します.
  • len:バッファ長.
  • flags:動作方式を呼び出します.(1)MSG_DONTWAIT:操作がブロックされない;(2)MSG_ERRQUEUE:ソケットのエラーキューからエラー値を受信すべきであることを示し、異なるプロトコルに基づいて、エラー値は何らかの補佐的なメッセージで伝達され、使用者は十分なバッファを提供すべきである.エラーの原因となる元のパッケージはmsg_を通過します.iovecは一般的なデータとして伝達される.エラーが発生したデータはmsg_として元のターゲットアドレスに報告されます.nameが提供されます.エラーはsock_extended_Err構造形態を用いた.(3)MSG_PEEK:データ受信後、元のデータを受信キューに保持し、削除しないことを示し、その後の読み出し操作で同じデータを受信することもできます.(4)MSG_TRUNC:提供されるバッファよりも長い場合でも、パッケージの実際の長さを返します.packetソケットにのみ有効です.(5)MSG_WAITALL:要求が完全に満たされるまでブロック操作が要求されます.しかし、信号をキャプチャしたり、エラーが発生したり、接続が切断されたり、次回受信されるデータ型が異なる場合でも、要求量より少ないデータが返されます.(6)MSG_EOR:記録の終了を指示し、返されたデータは記録を完了する.(7)MSG_TRUNC:提供されるバッファよりも多くのスペースが必要であるため、データ・レポートの末尾データが破棄されたことを示します./(MSG_TRUNC使用エラー、4こそMSG_TRUNCの正しい解釈)/(8)MSG_CTRUNC:バッファ容量が不足しているため、一部の制御データが破棄されたことを示します.(9)MSG_OOB:out-of-bandデータを受信したこと(すなわち、優先処理が必要なデータ)を示す.(10)MSG_ERRQUEUE:ソケットエラーキューからのエラー以外に、他のデータが受信されていないことを示します.from:(オプション)ポインタは、ソースアドレスが入ったバッファを指します.fromlen:(オプション)ポインタ.fromバッファ長の値を指します.

  • 送信
    関数のプロトタイプ:
    int sendto( SOCKET s, const char FAR* buf, int size, int flags, const struct sockaddr FAR* to, int tolen);
    

    パラメータの説明:
  • s:ソケット
  • buf:送信対象データのバッファ
  • size:バッファ長
  • flags:呼び出し方式フラグビット、一般的に0であり、Flagsを変更すると、Sendto送信の形式
  • が変更される
  • addr:(オプション)ポインタ、宛先ソケットのアドレス
  • を指す
  • tolen:addrが指すアドレスの長さ
  • 戻り値:成功した場合は送信バイト数を返し、失敗した場合はSOCKET_を返すERROR. ソケット受信接続要求
  • 関数のプロトタイプ:
    int accept( int fd, struct socketaddr* addr, socklen_t* len);
    

    パラメータの説明:
  • fd:ソケット記述子.
  • addr:接続されたアドレス
  • を返す
  • len:戻りアドレスを受信バッファ長
  • 戻り値:クライアントのファイル記述子が正常に戻り、-1が失敗しました.

  • Demo(C):
    サービス側(Server):
    #include
    #include
    #pragmacomment(lib,"ws2_32.lib")
    void main()
    {
    WSADATA wsaData;
    SOCKET sockServer;
    SOCKADDR_IN addrServer;
    SOCKET sockClient;
    SOCKADDR_IN addrClient;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    sockServer=socket(AF_INET,SOCK_STREAM,0);
    addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY    IP
    addrServer.sin_family=AF_INET;
    addrServer.sin_port=htons(6000);//    6000
    bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
     
    //Listen   
    listen(sockServer,5);//5       
    printf("      :
    ...
    "); int len=sizeof(SOCKADDR); charsendBuf[100];// charrecvBuf[100];// // , sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len); // recv(sockClient,recvBuf,100,0); printf("%s
    ",recvBuf); // socket closesocket(sockClient); WSACleanup();}

    クライアント(Client):
    #include
    #include
    #pragmacomment(lib,"ws2_32.lib")
    void main()
    {
    WSADATA wsaData;
    SOCKET sockClient;//   Socket
    SOCKADDR_IN addrServer;//     
    WSAStartup(MAKEWORD(2,2),&wsaData);
    //     socket
    sockClient=socket(AF_INET,SOCK_STREAM,0);
    //           
    addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//  IP(127.0.0.1     )
    addrServer.sin_family=AF_INET;
    addrServer.sin_port=htons(6000);//    6000
    //      
    connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
    //    
    charmessage[20]="HelloSocket!";
    send(sockClient,message,strlen(message)+1,0);
    //  socket
    closesocket(sockClient);
    WSACleanup();}