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_IRDA
u_char irdaDeviceID[];//设备的ID
char irdaServiceName[];//服务名
} SOCKADDR_IRDA, *PSOCKADDR_IRDA, *LPSOCKADDR_IRDA;
这里说一下如何获取附近的红外线设备
//如何获取附近的红外线设备
DEVICELIST devList;//
DWORD dwListLen = sizeof(DEVICELIST);
SOCKET sock = WSASocket(AF_IRDA,SOCK_STREAM,,NULL,;WSA_FLAG_OVERLAPPED);//
devList.numDevice = ;
DWORD deRet = getsockopt(sock,SOL_IRLMP,ITLMP_ENUMDEVICES,(char*)&devlist,&dwListLen);//获取sock配置情况
其中函数getsockopt()是一个很重要的函数,如
//获取套接字的配置情况
int getsockopt(
SOCKET s,//套接字标识
int level,// 选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP
int optname,// 需获取的套接口选项
char *optval,// 指向存放所获得选项值的缓冲区
int *optlen//指向optval缓冲区的长度值。
);
红外线服务器建立过程
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[];//网段号
char sa_nodenum[];//物理地址
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,,WSA_FLAG_OVERLAPPED)
若想建立有连接的通信,可改变参数SOCK_DGRAM为SOCK_STREAM或NSPROTO_SPX等。
IPX示例:
//socket.cpp
//IPX/SPX 套接字
#include <windows.h>
#include "stdio.h"
#include <Wsipx.h> #pragma comment(lib, "ws2_32.lib") void main()
{
//创建套接字
SOCKET sdServer;
// SOCKET s2 = WSASocket(AF_IRDA,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
SOCKADDR_IPX IPXAddr;
int addLen = sizeof(SOCKADDR_IPX);
if ((sdServer = socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX)) == INVALID_SOCKET)
{
printf("Socket failed with error%d\n",WSAGetLastError());
getchar();
return;
}
//绑定套接字
memset(&IPXAddr,0x00,sizeof(SOCKADDR_IPX));
IPXAddr.sa_family = AF_IPX;
IPXAddr.sa_socket = htons();
if (bind(sdServer,(PSOCKADDR)&IPXAddr,sizeof(SOCKADDR_IPX)) == SOCKET_ERROR)
{
printf("bind failed with error%d\n",WSAGetLastError());
getchar();
return;
} //获取服务名
if (getsockname((unsigned)sdServer,(PSOCKADDR)&IPXAddr,&addLen) == SOCKET_ERROR)
{
printf("getsockname failed with error%d\n",WSAGetLastError());
getchar();
return;
}
//打印信息
printf("%s\n%s\n%s\%s",IPXAddr.sa_family,IPXAddr.sa_netnum,IPXAddr.sa_nodenum,IPXAddr.sa_socket);
getchar(); }
必须保证你电脑上装有IPX协议,不然无法运行成功。
第三、NetBIOS 套接字
创建套接字
//方式一
SOCKET s = WSASocket( AF_NETBIOS,//地址家族
SOCK_DGRAM | SOCK_SEQPACKET,//协议类型,两个只能选择一个
lana,//LANA编号
NULL,//协议相关信息
,//组名
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 = ; i < dwNum ; i ++)
{
//查询地址家族
if (lpProtocolBuf[i].iAddressFamily == AF_NETBIOS)
{
//查询是无连接还是面向连接的
s[j++] = WSASocket(FROM_PROTOCOL_INFO,FROM_PROTOCOL_INFO,FROM_PROTOCOL_INFO,
&lpProtocolBuf[i],,WSA_FLAG_OVERLAPPED);
}
}
第四、AppleTalk 套接字
AppleTalk名实际上是以三个独立的名字为基础的:名、类型和区。每个名字的长度可达32个字符。这个名字标识机器上的进程及其关联套接字。类型是区的子群机制。传统意义上,区是一个网络,它是由物理定位于同一个循环上、使用AppleTalk协议的计算机构成的。AppleTalk名必须是独一无二的。
头文件 wshatalk.h 必须包含这个头文件才能使用相关的数据结构。
//地址结构
typedef struct sockaddr_at
{
USHORT sat_family;//地址家族 AF_APPLETALK
USHORT sat_net; //域
UCHAR sat_node; //节点
UCHAR sat_socket;//套接字
} SOCKADDR_AT, *PSOCKADDR_AT;
简单创建AppleTalk套接字
//创建appletalk socket
s = socket(AF_APPLETALK,SOCK_STREAM,ATPROTO_ADSP);
if(s == INVALID_SOCKET)
{
printf("socket error : %d \n",WSAGetLastError());
getchar();
return ;
}
如果想注册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结构转换成一个格式化的字符串,反之亦然。
//将sockaddr地址转换成字符串
INT WSAAPI WSAAddressToString(
_In_ LPSOCKADDR lpsaAddress,//特定的协议,ATM,Appletalk
_In_ DWORD dwAddressLength,//sockaddr的长度
_In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,//可选参数,协议提供者
_Inout_ LPTSTR lpszAddressString,//易于理解的字符串,即转换成的字符串
_Inout_ LPDWORD lpdwAddressStringLength//字符串长度
); //将字符串转换成sockaddr结构
INT WSAAPI WSAStringToAddress(
_In_ LPTSTR AddressString,//要转换的字符串
_In_ INT AddressFamily,//地址家族
_In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,// 可选参数,协议提供者
_Out_ LPSOCKADDR lpAddress,//sockaddr 结构指针
_Inout_ LPINT lpAddressLength//sockaddr结构长度
);
Windows网络编程笔记5 -- 其他套接字的更多相关文章
- UNIX 网络编程笔记-CH3:套接字编程简介
IPv4套接字地址结构 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; /* length of ...
- [转载] 读《UNIX网络编程 卷1:套接字联网API》
原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...
- Windows网络编程笔记6 --- WinSock I/O 控制方法
Windows提供了两种方式“套接字模式”和“套接字I/O模型”,可对一个套接字上的I/O行为加以控制.套接字模式用于决定在随一个套接字调用时,那些 Winsock函数的行为.其中的模型包括括sele ...
- Windows网络编程笔记4 -- Winsock 协议相关知识
Win32平台上的Winsock编程,Winsock是一个与协议无关的接口.以下协议是我们需要了解的: 网络协议的特征包括: 1. 面向消息 2. 面向连接和无线接 3. 可靠性和次序性 4. ...
- 《Unix网络编程卷1:套接字联网API》读书笔记
第一部分:简介和TCP/IP 第1章:简介 第2章:传输层:TCP.UDP和SCTP TCP:传输控制协议,复杂.可靠.面向连接协议 UDP:用户数据报协议,简单.不可靠.无连接协议 SCTP:流控制 ...
- 《UNIX网络编程 卷1:套接字联网API》读书笔记(一):网络编程简介
概述 要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议.大多数网络是按照划分成客户和服务器来组织的.本章及后续章节的焦点是TCP/IP协议族,也可称为网际协议族.下图为客户与服务器 ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- java tcp ip网络编程(二) 套接字的基本使用
##基本套接字的使用 linux系统把网络io抽象成socket,对网络的编程就是对socket的编程. java把套接字抽象成类似的类 InetAddress SocketAddress 识别jav ...
- 网络编程(socket,套接字)
服务端地址不变 ip + mac 标识唯一一台机器 ip +端口 标识唯一客户端应用程序 套接字: 网络编程 网络编程 一.python提供了两个级别访问的网络服务 低级别的网络服务支持基本的 S ...
随机推荐
- WPF学习二:TextBlock和Label的区别
TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速 ...
- Java 日期时间格式化
在此记录Java日期时间格式化转换符,方便以后有需要时查找. 1.日期格式化 2.时间格式化 3.格式化常见的日期时间组合
- pat甲级1044二分查找
1044 Shopping in Mars(25 分) Shopping in Mars is quite a different experience. The Mars people pay by ...
- shp格式数据发布服务:postGIS + postgresql + geoserver
主要流程: ①使用postgresql创建数据库 ②下载安装postgis插件 ③在创建的数据库中使用postgis插件,执行下列语句 CREATE EXTENSION postgis; CREATE ...
- [OS] 可执行文件的装载
http://www.jianshu.com/p/e1300e7a4c48 1. 虚拟内存 在早期的计算机中,程序是直接运行在物理内存上的,程序在运行时访问的地址就是物理地址.可是,当计算机中同时运行 ...
- C语言exp()函数:e的次幂函数(以e为底的x次方值)
头文件:#include <math.h> exp()用来计算以e 为底的x 次方值,即ex 值,然后将结果返回.其原型为: double exp(double x); [返回值]返 ...
- 02-CSS基础与进阶-day13_2018-09-21-20-05-21
css3动画 @keyframes 动画名 { 0% { } 100% { } } 元素执行动画 animation: 动画名 运动时间 运动曲线 01运动的汽车.html <!DOCTYPE ...
- 高阶函数 -------JavaScript
高阶函数 本文摘要:http://www.liaoxuefeng.com/ JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作 ...
- 1025: [SCOI2009]游戏
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1794[Submit][Status][Discuss] Descripti ...
- MySql学习笔记01
MySql01 课程介绍 数据库简介 之前通过流操作文件的方式存储数据弊端: 1. 效率低 2. 不管是存还是取都比较麻烦 3. 一般只能存储小量数据 4. 只能存储文本数据 什么是DB DataBa ...