socket函数分析
int socket( int af, int type, int protocol)
函数参数解释:
af:一个地址描述,目前仅支持AF_INET格式
type:指定socket类型。
protocol:顾名思义,就是指定协议。
返回值:
若无错误发生,socket()返回引用新套接口的描述字。否则的话,返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()获取相应错误代码。
int bind(int sockfd, const struct socket* addr, socklen_t addrlen)
将socket和socket地址结构绑定
函数参数解释:
sockfd:是一个套接字描述符。
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
address_len:确定address缓冲区的长度。
返回值:
如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
实例:
bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))//注意&取地址符
int listen(int sockfd,int backlog)
调用listen()来监听socket
函数参数解释:
sockfd:要监听的socket的描述字
backlog:socket可以排队的最大数。
返回值:
如无错误发生,listen()返回0。否则的话,返回SOCKET_ERROR错误
int accept(int sockfd, struct sockaddr*addr, socklen_t*addrlen)
TCP服务器监听到客户端发送的连接请求后,就会调用accept()函数接收请求
函数参数解释:
sockfd:服务器的socket描述字
addr:指向的struct sockaddr*指针,返回客户端的协议地址,用于保存客户端的信息
addrlen:协议地址的长度
返回值:
accpet返回一个新的socket(由内核自动生成),即连接套接字。
注意:当服务器完成与某个客户端的通信后,这个连接套接字自动消失!
int recv( SOCKET s, char FAR *buf, int len, int flags );
本函数用于已连接的数据报或流式套接口进行数据的接收。
这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)
函数参数解释:
第一个参数:指定接收端套接字描述符;如果是服务器端次参数为连接套接字
第二个参数:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数:指明buf的长度;
第四个参数:一般置0。
返回值:
recv函数返回其实际copy的字节数,如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
int send( SOCKET s, const char FAR *buf, int len, int flags )
不论是客户端还是服务器端应用程序都用send函数来向TCP连接的另一端发送数据
函数参数解释:
第一个参数:指定发送端套接字描述符;
第二个参数:指明一个存放应用程序要发送数据的缓冲区;
第三个参数:指明实际要发送的数据的字节数;
第四个参数:一般置0。
返回值:
如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR
注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)
int connect(int sockfd, const struct* addr, socklen_t addrlen)
客户端通过调用connect()函数与TCP服务器建立连接
connect()用来将参数sockfd 的socket 连至参数addr 指定的网络地址
函数参数解释:
sockfd:客户端的socket描述字
add:服务器socket地址
Addrlen:socket地址长度
返回值:
成功则返回0, 失败返回-1, 错误原因存于errno 中。
存储socket信息的结构体
sockaddr_in的功能与socdaddr相同,也是用来保存一个套接字的信息,不同的是将IP地址与端口分开为不同的成员,定义如下:
struct sockaddr_in
{
unsigned short int sin_family; //指定通信地址类型
uint16_t sin_port; //套接字使用的端口号
struct in_addr sin_addr; //需要访问的IP地址
unsigned char sin_zero[8]; //未使用的字段,填充为0
}; 在这一结构中,in_addr也是一个结构体,定义如下,用于保存一个IP地址:
struct in_addr
{
uint32_t s_addt;
};