

英语原文共 9 页,剩余内容已隐藏,支付完成后下载完整资料
WinSock 编程
1.介绍
Windows 套接字规范描述了一个通用的界面对于网络窗口程序。WinSock 使用 TCP/IP 通信,并提供为二进制代码和源代码不同类型的网络的兼容性。Windows 套接字 API (WinSock API) 是执行的函数库套接字接口由 UNIX 伯克利软件分布。WinSock 增强伯克利套接字实现通过添加特定于 Windows 的扩展支持消息驱动的 Windows 系统性质。
2.Windows 套接字
主要的 WinSock API 调用如下 ︰
socket ( )。创建套接字。
accept()。接受一个连接套接字上。
connect()。建立一个连接到对等。
bind ( )。与套接字相关联的本地地址。
listen ( )。建立套接字以侦听传入的连接。
send ( )。在已连接的套接字上发送数据。
recv ()。从套接字接收数据。
shutdown ()。禁用发送或接收套接字上的操作。
closesocket ()。关闭套接字
图 20.1 显示了操作的连接从客户端到服务器。服务器是客户端定义为等待连接的计算机,是计算机的最初接触到服务器。
图 20.1
在服务器上的计算机最初创建套接字的socket () 函数,与这绑定到一个名称与 bind () 函数。在此之后服务器侦听连接listen () 函数。当客户端调用accept () 功能服务器然后接受连接与accept ()。在此之后的服务器和客户端可以发送和接收数据与send () 或 recv () 函数。当数据传输完毕closesocket () 用于关闭套接字。
2.1 socket()
Socket () 函数创建一个套接字。它的语法是 ︰
插座 (int af,int 类型; int 协议)
Where
af PF_INET 值指定 ARPA 互联网地址格式规范。
type 套接字规范,这是 SOCK_STREAM 或 SOCK_DGRAM。的SOCK_STREAM 使用 TCP,并提供测序、 可靠、 双向、基于连接的流。
protocol SOCK_ DGRAM 使用 UDP 和提供无连接数据报。不推荐这种类型的连接。定义与套接字使用的协议。如果它是零然后调用方没有不希望指定的协议。
如果socket函数成功返回值则引用新的描述符套接字。否则为它返回 SOCKET_ ERROR,并且可以用来测试特定的错误代码WSAGetLastError。下一步给出了示例创建的套接字:
SOCKET s;
s=socket(PF INET,SOCK STREAM,O);
if (s==INVALID_SOCKET)
{
cout lt;lt; 'Socket error
}
2.2 bind()
bind()函数将与套接字关联的本地地址。它是连接调用之前还是听功能。当一个套接字创建的套接字时,它存在于一个名称空间 (地址家庭),但它有没有分配的名称。Bind 函数使套接字地方协会(主机地址/端口号)。它的语法是:
int bind(SOCKET s, const struct sockaddr FAR * addr, int namelen);
where
s 确定绑定套接字的描述符。
namelen 地址长度。
addr 地址在哪里
要分配到套接字的地址。接近于结构定义为如下所示︰
struct sockaddr
{
u_short sa_family;
char sa_data[l4];
}
互联网地址族,sockadd_in 结构中的已经用到 Windows Sockets指定要连接的套接字的本地或远程终结点地址。这是的sockaddr形式接近于结构具体的互联网地址族和可以转换为接近于socaddr。这种sockaddr_in结构可以用在具有以下形式的结构接近于填充︰
struct SOCKADDR_IN
{
short sin_farnily;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[B];
}
sin_family 必须设置为AF_INET。
sin_port IP IP 端口。
sin_addr IP IP 地址。
sin_zero 填充以使结构的大小和sockaddr.相同。
如果应用程序不关心什么地址分配给它,它可以指定互联网等于 INADDR_ANY,一个端口等于 0,或两个端口都为0。互联网地址等于INADDR_ANY 任何导致任何适当的网络接口使用。端口值为 0 的原因Windows Sockets实现应用程序与一个值分配一个唯一的端口1024 到 5000 之间。
如果没有错误发生,则它返回零值。否则,它将返回INVALID_SOCKET,和可以用WSAGetLastError 来测试特定的错误代码。
如果应用程序需要绑定到任意端口1024到5000范围外,然后可以使用以下的大纲代码:
#include lt;windows.hgt;
#include lt;winsock.hgt;
int main(void)
{
SOCKADDR_IN sin;
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,O);
if (s == INVALID_SOCKET)
{
//Socket failed
}
sin.sin_family = AF_INET;
sin.sin-addr.s_addr= 0;
sin.sin_port = htons(100); //port=lOO
if (bind(s, (LPSOCKADDR)amp;sin, sizeof (sin))==0)
{
// Bind failed
return(O);
}
Windows socket htons 函数转换为无符号(u_short)从主机字节顺序变为网络字节顺序。
2.3 connect()
connect() 函数建立与对等方的连接。如果指定的套接字未绑定然后独特的值被分配到地方协会由系统和插座被标记为绑定。它的语法是:
int connect (SOCKET s, canst struct sockaddr FAR * name,int namelen)
where
s 确定未连接的套接字的描述符。
名称 套接字将连接到对等名称。
namelen 名称的长度。
如果没有错误发生,则它返回零值。否则,它返回 SOCKET_ERROR,和可以用 WSAGetLastError 来测试特定的错误代码。
2.4 listenO
listen () 函数建立侦听传入的连接的套接字。要创建并接受套接字是的序列 ︰
socket().建立一个套接字。
listen(). 这为创建队列的传入连接,通常由使用可以有一次有多个连接的服务器。
accept().这些连接然后接受与接受。
listen()语法:
int listen (SOCKET s, int backlog)
where
s 描述绑定、 未连接的套接字。
backlog 最大数量的挂起连接队列大小可能的定义成长 (通常5个 最多)。
如果没有错误发生,则它返回零值。否则,它返回 SOCKET_ERROR,和可以用 WSAGetLastError 来测试特定的错误代码。
#include lt;windows.hgt;
#include lt;winsock.hgt;
int main(void)
{
SOCKADDR_IN sin;
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,O);
if (s == INVALID_SOCKET)
{
// Socket failed
}
sin.sin family= AF !NET;
sin.sin-addr.s addr-= 0;
sin.sin_port = htons(l00); // port=lOO
if (bind(s, (struct sockaddr FAR *)amp;sin, sizeof (sin))
{
// Bind failed
}
if (listen(s,4)==SOCKET_ERROR)
{
// Listen failed
}
return(O);
}
2.5 accept()
accept()函数接受一个连接套接字上。它将提取任何挂起的连接从队列,并且创建一个新的套接字与指定套接字相同的属性。最后,它返回新的套接字的句柄。它的语法是︰
SOCKET accept (SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen ) ;
where
s 说明符标识是在套接字监听模式。
addr 指针指向接收缓冲区的地址连接的实体,称为对通信层。
addrlen 指针到一个整数,它包含的地址 addr 长度。
如果没有错误发生,则它返回零值。否则,它返回 SOCKET_ERROR,和可以用 WSAGetLastError 来测试特定的错误代码。
#include lt;windows.hgt;
#include lt;winsock.hgt;
int main(void)
{
SOCKADDR IN sin;
SOCKET s;
int sin_len;
s=socket(AF_INET,SOCK_STREAM,O);
if (s==INVALID_SOCKET)
{
//Socket failed
sin.sin_family==AF_INET;
sin.sin-addr.s_addr=0;
sin.sin=port_htons(lOO);//port=lOO
if (bind(s, (struct sockaddr FAR *)amp;sin, sizeof (sin))==SOCKET_ERROR)
{
//Bind failed
}
if (listen(s,4)lt;0)
{
//Listen failed
}
sin_len=sizeof(sin);
s=accept(s, (struct sockaddr FAR*) amp; sin, (int FAR*) amp;sin_len);
if (s==INVALID_SOCKET)
{
//Accept failed
)
return(O);
}
2.6 send()
Send()函数将数据发送到连接的套接字。它的语法是:
int send (SOCKET s, const char FAR *buf, int len, int flags)
where
s 连接套接字描述符。
buf 传输数据缓冲区。
len 缓冲区的长度。
flag 调用标志
Flags 参数影响函数的行为。这些可以是 ︰
MSG_DONTROUTE 指定的数据应该不受路由。
MSG_OOB 发送带外数据
如果send ()成功,那么返回的值是字符组 (它可以是少数目比由 len 指示的数字)。否则,它返回 SOCKET_ERROR和特定的错误,可以用 WSAGetLastError 来测试代码。
#include lt;windows.hgt;
#include lt;winsock.hgt;
#include lt;string.hgt; 剩余内容已隐藏,支付完成后下载完整资料
资料编号:[31134],资料为PDF文档或Word文档,PDF文档可免费转换为Word
您可能感兴趣的文章
- 饮用水微生物群:一个全面的时空研究,以监测巴黎供水系统的水质外文翻译资料
- 步进电机控制和摩擦模型对复杂机械系统精确定位的影响外文翻译资料
- 具有温湿度控制的开式阴极PEM燃料电池性能的提升外文翻译资料
- 警报定时系统对驾驶员行为的影响:调查驾驶员信任的差异以及根据警报定时对警报的响应外文翻译资料
- 门禁系统的零知识认证解决方案外文翻译资料
- 车辆废气及室外环境中悬浮微粒中有机磷的含量—-个案研究外文翻译资料
- ZigBee协议对城市风力涡轮机的无线监控: 支持应用软件和传感器模块外文翻译资料
- ZigBee系统在医疗保健中提供位置信息和传感器数据传输的方案外文翻译资料
- 基于PLC的模糊控制器在污水处理系统中的应用外文翻译资料
- 光伏并联最大功率点跟踪系统独立应用程序外文翻译资料
