Windows网络编程笔记5 -- 其他套接字
包括紅外線套接字(IrSock)、IPX/SPX 套接字、NetBIOS 套接字、AppleTalk 套接字、ATM 套接字等。對這些套接字進行簡單介紹。
第一、紅外線套接字(I r S o c k)
頭文件? #include”af_irda.h” ,函數定義等都在這里面,可以研究一下這個文件。
地址結構
//結構類型 typedef struct _SOCKADDR_IRDA {u_short irdaAddressFamily;//紅外線接口地址家族 AF_IRDAu_char irdaDeviceID[4];//設備的IDchar 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提供兩個進程間的無連接通信。IPX是一種無連接通信。
IPX網絡、網段是用IPX路由器橋接在一起的。每個網段分配4字節的唯一地址號。當更多的網段橋接在一起時,IPX路由器管理網段之間的通信,每個網段有唯一的網段號。IPX用套接字號來區分一個節點上的通信。
要用IPX進行Winsock客戶機或服務器通信,必須建立SOCKADDR_IPX結構。該結構在Wsipx.h頭文件中定義,應用程序在包括Winsock2.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\n",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\n",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\n",WSAGetLastError()); 37 getchar(); 38 return; 39 } 40 //打印信息 41 printf("%s\n%s\n%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\n",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名實際上是以三個獨立的名字為基礎的:名、類型和區。每個名字的長度可達32個字符。這個名字標識機器上的進程及其關聯套接字。類型是區的子群機制。傳統意義上,區是一個網絡,它是由物理定位于同一個循環上、使用AppleTalk協議的計算機構成的。AppleTalk名必須是獨一無二的。
頭文件?? wshatalk.h ??必須包含這個頭文件才能使用相關的數據結構。
//地址結構 typedef struct sockaddr_at {USHORT sat_family;//地址家族 AF_APPLETALKUSHORT 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 \n",WSAGetLastError()); 6 getchar(); 7 return 1; 8 }如果想注冊AppleTalk名,則必須保證使用三個參數,如下
#define MY_ZONE "*"//區,當前區
#define MY_TYPE "Winsock_app"//類型
#define MY_OBJECT "Appletalk-server"//名
這個AppleTalk很復雜,我暫時就不深入研究了。
第四、ATM 套接字
異步傳輸協議ATM,ATM協議沒有提供流控制。它是一個面向連接的協議,要么提供消息模式,要么提供流模式。
一個ATM網絡有兩個網絡接口:用戶網絡接口(UNI)和網絡節點接口(NNI)。UNI接口是在終端和ATM交換機之間建立的,而NNI接口則是在兩個交換機之間建立的。
頭文件??? ws2atm.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;第二個參數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 套接字是一個十六進制的ASCII字符串,由40個字符組成,與組成ATM_ADDRESS結構NSAP式或E.164地址的20個字節相對應,所以使用時需要將其轉換成ATM_ADDRESS 結構,這里有一個Windows提供的函數可供轉換WSAStringToAddress()。
地址結構轉換
WSAAddressToString和WSAStringToAddress。這兩個函數提供了一個與協議無關的轉換方法,可以把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 );
轉載于:https://www.cnblogs.com/songliquan/p/3413750.html
總結
以上是生活随笔為你收集整理的Windows网络编程笔记5 -- 其他套接字的全部內容,希望文章能夠幫你解決所遇到的問題。