Windowsネットワークプログラミングノート5--その他のソケット

21506 ワード

赤外線ソケット(IrSock)、IPX/SPXソケット、NetBIOSソケット、AppleTalkソケット、ATMソケットなどが含まれています.これらのソケットについて簡単に紹介します.
第一、赤外線ソケット(Ir S o c k)
ヘッダファイルinclude af_irda.h」、関数定義などはここにありますので、このファイルを検討してみてください.
アドレス構造
//    
typedef struct _SOCKADDR_IRDA {
  u_short irdaAddressFamily;//            AF_IRDA
  u_char  irdaDeviceID[4];//   ID
  char    irdaServiceName[25];//   
} SOCKADDR_IRDA, *PSOCKADDR_IRDA, *LPSOCKADDR_IRDA;

近くの赤外線機器の入手方法についてお話しします
1 //            
2 DEVICELIST devList;//
3 DWORD dwListLen = sizeof(DEVICELIST);
4 SOCKET sock = WSASocket(AF_IRDA,SOCK_STREAM,0,NULL,0;WSA_FLAG_OVERLAPPED);//
5 devList.numDevice = 0;
6 DWORD deRet   = getsockopt(sock,SOL_IRLMP,ITLMP_ENUMDEVICES,(char*)&devlist,&dwListLen);//  sock    

ここで、関数getsockopt()は重要な関数です.
1 //          
2 int getsockopt(
3   SOCKET s,//     
4 int level,//        。       SOL_SOCKET IPPROTO_TCP
5   int optname,//          
6   char *optval,//               
7   int *optlen//  optval       。
8 );

赤外線サーバ構築プロセス
1)アドレスファミリーAFを作成するIRDAソケットタイプSOCK_STREAM.
2)サーバのサービス名でSOCKADDRを記入するIRDA構造.
3)ソケットハンドルとSOCKADDRを利用するIRDA構造はbindを呼び出す.
4)ソケットハンドルとbacklog境界を用いてlistenを呼び出す.
5)アクセスクライアントのaccept呼び出しをロックします.
赤外線クライアント構築プロセス
1)アドレスファミリーの確立AF_IRDAソケットとソケットタイプSOCK-STREAM.
2)IRLMP_が呼び出されるENUM_DEVICESオプションのgetsockopt関数は、使用可能な赤外線デバイスをすべて列挙します.
3)返却された各機器について、機器IDと接続準備サービス名とを用いてSOCKADDR_を記入するIRDA構造.
4)ソケットハンドルとSOCKADDRを利用するIRDA構造、connect関数を呼び出します.手順3)に記載された構成について、接続が成功するまで手順4)を繰り返します.
ソケットを作成するには、次のようにします.他の操作は一般的なsocketと同じです.
    SOCKETs=socket(AF_IRDA,SOCK_STREAM,0);
    SOCKETs2=WSASocket(AF_IRDA,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
第二に、IPX/SPXソケット
「インターネット・パッケージ交換」(IPX)プロトコルは、一般的にNovellNetWareクライアント/サーバのネットワーク・サービスを担当するコンピュータに使用される一般的なプロトコルです.IPXは2つのプロセス間の無接続通信を提供する.IPXは無接続通信です.
IPXネットワーク、セグメントはIPXルータでブリッジされています.各セグメントには4バイトの一意のアドレス番号が割り当てられます.より多くのセグメントがブリッジされると、IPXルータはセグメント間の通信を管理し、各セグメントに一意のセグメント番号がある.IPXは1つのノード上の通信をソケット番号で区別する.
IPXでWinsockクライアントまたはサーバ通信を行うには、SOCKADDR_を確立する必要があります.IPX構造この構成はWsipxである.hヘッダファイルで定義、アプリケーションはWinsock 2を含む.hファイルの後には、そのファイルも含まなければならない.
//ipx    
typedef struct sockaddr_ipx {
    short sa_family;//    
    char  sa_netnum[4];//   
    char  sa_nodenum[6];//    
    unsigned short sa_socket;//       
} SOCKADDR_IPX, *PSOCKADDR_IPX,FAR *LPSOCKADDR_IPX;

ソケットの作成
//     ,IPX        
SOCKET s1 = socket(AF_IPX, SOCK_DGRAM,NSPROTO_IPX);//        0
SOCKET s2 = WSASocket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX,NULL,0,WSA_FLAG_OVERLAPPED)

接続された通信を確立するには、パラメータSOCK_を変更します.DGRAMはSOCK_STREAMまたはNSPROTO_SPXなど.
IPXの例:
 1 //socket.cpp
 2 //IPX/SPX    
 3 #include <windows.h>
 4 #include "stdio.h"
 5 #include <Wsipx.h>
 6 
 7 #pragma comment(lib, "ws2_32.lib")
 8 
 9 void main()
10 {
11     //     
12     SOCKET sdServer;
13 //    SOCKET s2 = WSASocket(AF_IRDA,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
14     SOCKADDR_IPX IPXAddr;
15     int addLen = sizeof(SOCKADDR_IPX);
16     if ((sdServer = socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX)) == INVALID_SOCKET)
17     {
18         printf("Socket failed with error%d
",WSAGetLastError()); 19 getchar(); 20 return; 21 } 22 // 23 memset(&IPXAddr,0x00,sizeof(SOCKADDR_IPX)); 24 IPXAddr.sa_family = AF_IPX; 25 IPXAddr.sa_socket = htons(5150); 26 if (bind(sdServer,(PSOCKADDR)&IPXAddr,sizeof(SOCKADDR_IPX)) == SOCKET_ERROR) 27 { 28 printf("bind failed with error%d
",WSAGetLastError()); 29 getchar(); 30 return; 31 } 32 33 // 34 if (getsockname((unsigned)sdServer,(PSOCKADDR)&IPXAddr,&addLen) == SOCKET_ERROR) 35 { 36 printf("getsockname failed with error%d
",WSAGetLastError()); 37 getchar(); 38 return; 39 } 40 // 41 printf("%s
%s
%s\%s
",IPXAddr.sa_family,IPXAddr.sa_netnum,IPXAddr.sa_nodenum,IPXAddr.sa_socket); 42 getchar(); 43 44 }

あなたのパソコンにIPXプロトコルがインストールされていることを保証しなければなりません.そうしないと、成功しません.
第三、NetBIOSソケット
ソケットの作成
//   
SOCKET s = WSASocket(                AF_NETBIOS,//    
SOCK_DGRAM | SOCK_SEQPACKET,//
lana,//LANA  
NULL,//      
0,//  
WSA_FLAG_OVERLAPPED);//     

また、列挙により、転送プロトコルに基づいてソケットを確立することもできる.
//  2
//
WSAPROTOCOL_INFO lpProtocolBuf;
DWORD dwBufLen;
DWORD dwNum = WSAEnumProtocols(NULL,lpProtocolBuf,&dwBufLen);
if (dwNum == SOCKET_ERROR)
{
    printf("socket error%d
",WSAGetLastError()); } for (int i = 0; i < dwNum ; i ++) { // if (lpProtocolBuf[i].iAddressFamily == AF_NETBIOS) { // s[j++] = WSASocket(FROM_PROTOCOL_INFO,FROM_PROTOCOL_INFO,FROM_PROTOCOL_INFO, &lpProtocolBuf[i],0,WSA_FLAG_OVERLAPPED); } }

第四に、AppleTalkソケット
AppleTalk名は、実際には3つの独立した名前に基づいています.名前、タイプ、エリアです.各名前の長さは32文字に達することができます.この名前は、マシン上のプロセスとその関連ソケットを識別します.タイプはゾーンのサブクラスタメカニズムです.従来の意味では、領域は、物理的に同じサイクル上に位置し、AppleTalkプロトコルを使用するコンピュータから構成されるネットワークである.AppleTalk名はユニークでなければなりません.
ヘッダファイルh関連するデータ構造を使用するには、このヘッダファイルを含まなければならない.
//    
typedef struct sockaddr_at
{
    USHORT    sat_family;//       AF_APPLETALK
    USHORT    sat_net;    // 
    UCHAR     sat_node;    //  
    UCHAR     sat_socket;//   
} SOCKADDR_AT, *PSOCKADDR_AT;

AppleTalkソケットの簡単な作成
1     //  appletalk socket
2     s = socket(AF_APPLETALK,SOCK_STREAM,ATPROTO_ADSP);
3     if(s == INVALID_SOCKET)
4     {
5         printf("socket error : %d 
",WSAGetLastError()); 6 getchar(); 7 return 1; 8 }

AppleTalk名を登録するには、次のように3つのパラメータを使用することを保証する必要があります.
#define MY_ZONE"*"//区、現在区
#define MY_TYPE「Winsock_app」//タイプ
#define MY_OBJECT「Appletalk-server」//名
このAppleTalkは複雑なので、しばらく深く研究しません.
第四、ATMソケット
非同期転送プロトコルATM、ATMプロトコルはフロー制御を提供していません.接続向けのプロトコルであり、メッセージ・モードを提供するか、ストリーム・モードを提供します.
1つのATMネットワークには、ユーザネットワークインターフェース(UNI)とネットワークノードインターフェース(NNI)の2つのネットワークインターフェースがある.UNIインタフェースは端末とATMスイッチの間で確立され,NNIインタフェースは2つのスイッチの間で確立される.
ヘッダファイルws 2 atm.hすべてのパラメータ定義はヘッダファイルにあります.
アドレス構造
typedef struct sockaddr_atm {
    u_short satm_family;         /* address family should be AF_ATM  */
    ATM_ADDRESS satm_number; /* ATM address */
    ATM_BLLI satm_blli;          /* B-LLI ,      */           
    ATM_BHLI satm_bhli;          /* B-HLI ,      */
} sockaddr_atm, SOCKADDR_ATM, *PSOCKADDR_ATM, *LPSOCKADDR_ATM;

2番目のパラメータATM_ADDRESS構造は以下の通りである.
#define ATM_ADDR_SIZE          20
typedef struct {
    DWORD AddressType; /* E.164    NSAP */
    DWORD NumofDigits; /*    */
    UCHAR Addr[ATM_ADDR_SIZE]; /* IA5    E164(E.164), BCD    NSAP(       )
} ATM_ADDRESS;

//ATMソケットの作成
   SOCKETs=socket(AF_ATM,SOCK_RAW,ATMPROTO_AAL5);
ATMソケットは16進数のASCII文字列で、40文字からなり、ATM_を構成しています.ADDRESS構造NSAP式またはE.164アドレスの20バイトに対応するため、使用時にはATM_に変換する必要があるADDRESS構造で、WSAstringToAddress()を変換するためにWindowsで提供される関数があります.
アドレスこうぞうへんかん
WSAAAddressToStringとWSAstringToAddress.この2つの関数は、SOCKADDR構造をフォーマットされた文字列に変換できるプロトコルに関係のない変換方法を提供し、逆も同様である.
 1 // sockaddr        
 2 INT WSAAPI WSAAddressToString(
 3   _In_      LPSOCKADDR lpsaAddress,//     ,ATM,Appletalk
 4   _In_      DWORD dwAddressLength,//sockaddr   
 5   _In_opt_  LPWSAPROTOCOL_INFO lpProtocolInfo,//
 6   _Inout_   LPTSTR lpszAddressString,//
 7   _Inout_   LPDWORD lpdwAddressStringLength//     
 8 );
 9 
10 
11 //       sockaddr  
12 INT WSAAPI WSAStringToAddress(
13   _In_      LPTSTR AddressString,//       
14   _In_      INT AddressFamily,//    
15   _In_opt_  LPWSAPROTOCOL_INFO lpProtocolInfo,//
16   _Out_     LPSOCKADDR lpAddress,//sockaddr     
17   _Inout_   LPINT lpAddressLength//sockaddr    
18 );