网络编程-Winsock (二)

2014-11-24 01:44:17 · 作者: · 浏览: 9
S_addr;
} S_un;
}; 该成员变量时一个整数,一般用函数inet_addr() 把字符串形式的IP地址转换为unsigned long 整型的整数值。

namelen:指定name缓冲区的长度。

inet_addr函数的原型如下:

[cpp] unsigned long inet_addr(
const char FAR *cp
);

unsigned long inet_addr(
const char FAR *cp
); 参数cp为一个点分多进制的IP地址

inet_addr 函数的逆函数如下:


[cpp] char FAR * inet_ntoa(
struct in_addr in
);

char FAR * inet_ntoa(
struct in_addr in
);
参数为一个addr_in 类型的变量。

监听端口:


[cpp] int listen(
SOCKET s,
int backlog
);

int listen(
SOCKET s,
int backlog
); 参数说明如下:

(1)s:使流套接字s处于监听状态。

(2)backlog :为处于监听状态的流套接字s维护一个客户连接请求队列。

接受请求:


[cpp] SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);

SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
); 服务端程序调用该函数从处于监听状态的流套接字的客户端请求队列中取出第一个请求并创建一个新的套接字与客户端进行通信。

参数说明如下:

(1)s:指定监听状态的套接字。

(2)addr :用来返回新创建的套接字的地址。

(3)addrlen :用来返回新创建的套接字的地址结构的长度。

连接函数如下:


[cpp] int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);

int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
); 客户端程序调用该函数来完成与远程服务器端的连接。

参数说明如下:

(1)s :客户端创建的套接字。

(2)name:该结构中包含了要服务器端中的IP地址和端口号。

(3)namelen:指定name缓冲区的长度。

具体进行通信的函数分为两类,一类是基于TCP协议的,一类是基于UDP协议的。数据的通信主要体现在数据的收发上,分别看一下这两种协议的收发数据的函数定义。

基于TCP的发送函数:


[cpp] int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
);

int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
); 参数说明如下:

(1)s:指定发送端套接字描述符。

(2)buf:指明一个存放应用程序要发送数据的缓冲区。

(3)len:指明实际要发送的数据的字节数。

(4)flags:一般设置为0、


基于TCP的接收函数:

[cpp] int recv( SOCKET s, char FAR *buf, int len, int flags ); int recv(
SOCKET s,
char FAR *buf,
int len,
int flags
);
参数说明如下:

(1)s:指定接收端套接字描述符。


(2)buf:指定一个缓冲区,用来存放接收到的数据。


(3)len:指定缓冲区的长度。


(1)一般设置为0。

基于UDP的发送函数:


[cpp] int sendto(
SOCKET s,
const char FAR *buf,
int len,
int flags,
const struct sockaddr FAR *to,
int tolen
);

int sendto(
SOCKET s,
const char FAR *buf,
int len,
int flags,
const struct sockaddr FAR *to,
int tolen
); 基于UDP的接收函数:

[cpp] int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen ); int recvfrom(
SOCKET s,
char FAR* buf,
int len,
int flags,
struct sockaddr FAR *from,
int FAR *fromlen
);

字节顺序:
在Socket 套接字编程中,传输数据的排列顺序以网络字节顺序和主机字节顺序为主。通常情况下,如果用户将数据通过网络发送时,需要将数据转换成以网络字节顺序排列,否则可能造成数据损坏。如果用户是将网络接收到的数据存储在本地计算机上,那么需要将数据转换成以主机字节顺序排列。

注意:IP地址结构 in_addr 中的成员S_addr 的值均是