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.套接字函数用法小结
值得注意的是,在以上的函数应用中,能归纳出以下几个重要的特点,我们应当牢记:
第一,所有的通信类和控制类函数都以套接字为关键参数;
第二,地址结构长度参数有时是形参,有时是实参(为什么会这样?当它作为形参时只做输入参数,而作为实参即指针传递时要作输出之用);
第三,要关注套接字函数返回值,以便于对可能出现的错误做出处理。
错误处理是一个在学习和使用套接字函数过程中非常重要的技能,有心的同学可以查阅更多的相关资料来学习。
致谢:感谢您的阅读。祝 一路顺风!
- socket网络编程复习笔记(四):认识套接字函数
- socket网络编程复习笔记(一):套接字基本原理(上)
- socket网络编程复习笔记(二):套接字基本原理(下)
- socket网络编程复习笔记(三):套接字描述符背后的秘密
- 网络编程笔记一、Socket套接字
- 网络编程socket套接字
- 套接字网络编程基础(四)
- linux网络编程之socket(十五):UNIX域套接字编程和socketpair 函数
- linux网络编程之socket(十五):UNIX域套接字编程和socketpair 函数
- linux网络编程之socket(十五):UNIX域套接字编程和socketpair 函数
- socket套接字编程函数
- [java]网络编程(Socket编程、套接字编程)
- 【网络编程学习笔记01】Socket套接字编程(TCP/IP)
- 认识套接字Socket
- c++网络编程------socket(套接字)编程----
- 网络编程——Socket(Linux套接字编程)
- 网络编程——socket套接字编程(二)
- 网络编程——socket套接字编程(三)
- 8.13 ** (The Location class)
- 动态生成矩阵选择器,选择面板
- iOS之触摸事件和手势
- 调试那些事儿
- 移植BOA到mini2440
- socket网络编程复习笔记(四):认识套接字函数
- 025 Reverse Nodes in k-Group [Leetcode]
- Android 生成图标的有力工具 Android Asset Studio
- Codeforces Round #327 (Div. 2) B. Rebranding (字符串)
- 声明式编程和命令式编程的比较
- kinect使用cvCreateVideoWriter不成功,depth.avi和rgb.avi为0字节的解决方法
- linux下/etc/hosts 和hostname文件的区别,如何正确地修改hostname
- Hadoop学习笔记之<搭建环境>
- Labview--常用的数据传递