socket网络编程复习笔记(四):认识套接字函数

来源:互联网 发布:amesim动力学仿真软件 编辑:程序博客网 时间:2024/06/01 09:00

在前面的内容中,我们知道了通信的基本流程,在通信过程中会用到很多套接字函数,诸如socket(),bind(),recv()等等。那么我们在实际编程中,我们该如何正确使用套接字函数呢?

1.socket函数分类

按照函数的功能不同,我们可以将大部分常用的套接字函数归入到以下四类中:
通信类:

socket();bind();listen();accept();connect();recv();send();sendto();recvfrom();select();shutdown();closesocket();

控制类:

ioctlsocket();setsockopt();

信息类:

getpeername();getsockname();getsockopt();

辅助类:

htonl();ntohl();htons();ntohs();inet_addr();inet_ntoa();

2.各个函数用法介绍

(1)SOCKET socket(IN int af,IN int type,IN int protocol)
其中,IN表示参数的作用是作为输入,OUT表示参数的作用是作为输出。
af代表地址族类型,TCP/IP(Internet)使用的地址族为AF_INET。
type代表套接字类型,主要有以下几类:
SOCK_STREAM:默认情况下使用TCP协议;
SOCK_DGRAM:默认情况下使用UDP协议;
SOCK_RAM:数据直接封装在IP分组内。
protocol代表协议号,一般设置为0。
此函数功能为:建立一个套接口结构,将其(套接字)描述符交给被调用者。

(2)int bind ( IN SOCKET s, IN struct sockaddr * addr, IN int addrlen)
其中s代表套接字描述符;
addr代表本地端点(套接口)地址结构指针;
addrlen代表本地端点地址结构大小。
此函数功能为:建立套接字与端点之间的关系,确定本地通信对象。如通信正常,返回0,错误则返回SOCKET_ERROR。

(3)int listen(IN SOCKET s,IN int backlog)
其中s代表套接字描述符;
backlog代表设置最大的同时监听连接个数,目前最大可设置为5(官方说法,事实上现在的Windows系统最大连接数有所上升)。
此函数功能为:设置套接字监听模式(即服务器模式),若成功则返回0,失败则返回-1。

(4)int connet(IN SOCKET s,IN struct sockaddr * addr, IN int addrlen)
其中s代表套接字描述符;
addr代表端点套接字地址结构指针;
addrlen代表端点地址结构大小。
此函数功能为:与服务器建立连接,若成功则返回0,失败则返回-1。

(5)SOCKET accept( IN SOCKET s,OUT struct sockaddr * addr,IN OUT int * addrlen )
其中s代表套接字描述符;
addr代表远端点套接字地址结构指针;
addrlen代表远端点地址结构大小指针。
此函数功能为:接受一个对方调用connect()请求的连接。该连接将在返回的新套接字上完成。若成功返回新的套接字描述符,若失败则返回-1。并输出addr远端点地址和addrlen远端点地址结构大小。

(6)int recv( IN SOCKET s,OUT char * buf, IN int len,IN int flags)
s代表套接字描述符;
buf代表接收缓冲区的指针;
len代表接收缓冲区大小;
flags代表接收方式,一般为0,MSG_OOB(读取带外数据),MSG_PEEK(数据不从队列中取出)为两种特殊状态。
此函数功能为:从套接字接收数据,数据将放在buf所指的缓冲区内。通过返回值,调用者可以获得真正接收的字节数。

(7)int send( IN SOCKET s, IN char * buf,IN int len, IN int flags)
s代表套接字描述符;
buf代表发送缓冲区的指针;
len代表发送的字节数;
flags代表发送方式,一般为0,MSG_OOB(发送带外数据),MSG_DONTROUTE(发送时不做路由选择)为两种特殊状态。
此函数功能为:从套接字发送数据,用户事先准备好数据,放在buf里。结果返回真正发送的字节数。

(8)int recvfrom( IN SOCKET s, OUT char * buf, IN int len, IN int flags,
OUT struct sockaddr * from,IN OUT int * fromlen)
s代表套接字描述符;
buf代表接收缓冲区的指针;
len代表接收缓冲区大小;
flags代表接收方式,一般为0;
from代表远端点地址结构指针;
fromlen代表远端点地址结构大小指针。
此函数功能为:在套接字接收数据,并捕获发送远端点地址,返回收到的字节数。

(9)int sendto( IN SOCKET s, IN char * buf , IN int len,
IN int flags, IN struct sockaddr * to, IN int tolen)
s代表套接字描述符;
buf代表发送缓冲区的指针;
len代表发送缓冲区大小;
flags代表发送方式,一般为0;
to代表远端点地址结构指针;
tolen代表远端点地址结构大小。
此函数功能为:在套接字发送数据,数据事先已准备好,放在buf中。

(10)int shutdown( IN SOCKET s, IN int how)
s代表套接字描述符;
how代表断开连接方式,有如下几种:
how为0(SD_RECEIVE): 套接字不再提供接收数据服务;
how为1(SD_SEND): 套接字不再提供发送数据服务(根据关闭TCP连接的握手流程,此时将发送FIN);
how为2(SD_BOTH): 套接字不再提供接收数据和发送
正确执行返回0,错误则返回-1。

(11)int closesocket( IN SOCKET s)
s代表套接字描述符。
此函数功能为:关闭套接字连接,即若套接字上有连接,连接也将被关闭。

3.套接字函数用法小结

值得注意的是,在以上的函数应用中,能归纳出以下几个重要的特点,我们应当牢记:
第一,所有的通信类和控制类函数都以套接字为关键参数;
第二,地址结构长度参数有时是形参,有时是实参(为什么会这样?当它作为形参时只做输入参数,而作为实参即指针传递时要作输出之用);
第三,要关注套接字函数返回值,以便于对可能出现的错误做出处理。

错误处理是一个在学习和使用套接字函数过程中非常重要的技能,有心的同学可以查阅更多的相关资料来学习。

致谢:感谢您的阅读。祝 一路顺风!

0 0
原创粉丝点击