Windowsネットワークプログラミングノート5--その他のソケット
21506 ワード
赤外線ソケット(IrSock)、IPX/SPXソケット、NetBIOSソケット、AppleTalkソケット、ATMソケットなどが含まれています.これらのソケットについて簡単に紹介します.
第一、赤外線ソケット(Ir S o c k)
ヘッダファイルinclude af_irda.h」、関数定義などはここにありますので、このファイルを検討してみてください.
アドレス構造
近くの赤外線機器の入手方法についてお話しします
ここで、関数getsockopt()は重要な関数です.
赤外線サーバ構築プロセス
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ファイルの後には、そのファイルも含まなければならない.
ソケットの作成
接続された通信を確立するには、パラメータSOCK_を変更します.DGRAMはSOCK_STREAMまたはNSPROTO_SPXなど.
IPXの例:
あなたのパソコンにIPXプロトコルがインストールされていることを保証しなければなりません.そうしないと、成功しません.
第三、NetBIOSソケット
ソケットの作成
また、列挙により、転送プロトコルに基づいてソケットを確立することもできる.
第四に、AppleTalkソケット
AppleTalk名は、実際には3つの独立した名前に基づいています.名前、タイプ、エリアです.各名前の長さは32文字に達することができます.この名前は、マシン上のプロセスとその関連ソケットを識別します.タイプはゾーンのサブクラスタメカニズムです.従来の意味では、領域は、物理的に同じサイクル上に位置し、AppleTalkプロトコルを使用するコンピュータから構成されるネットワークである.AppleTalk名はユニークでなければなりません.
ヘッダファイルh関連するデータ構造を使用するには、このヘッダファイルを含まなければならない.
AppleTalkソケットの簡単な作成
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すべてのパラメータ定義はヘッダファイルにあります.
アドレス構造
2番目のパラメータ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構造をフォーマットされた文字列に変換できるプロトコルに関係のない変換方法を提供し、逆も同様である.
第一、赤外線ソケット(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 );