socket之函数大全

来源:互联网 发布:ios 用沙盒缓存数据 编辑:程序博客网 时间:2024/05/21 22:56

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)

socketsocket地址结构绑定

函数参数解释:

sockfd:是一个套接字描述符。

address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。

address_len:确定address缓冲区的长度。

返回值:

如果函数执行成功,返回值为0,否则为SOCKET_ERROR

实例:

bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))//注意&取地址符

 

int listenint sockfdint backlog

调用listen()来监听socket

函数参数解释:

sockfd:要监听的socket的描述字

backlogsocket可以排队的最大数。

返回值:

如无错误发生,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 );  

 本函数用于已连接的数据报或流式套接口进行数据的接收。

这里只描述同步Socketrecv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copybuf(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的

函数参数解释:

第一个参数:指定接收端套接字描述符;如果是服务器端次参数为连接套接字

第二个参数:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

第三个参数:指明buf的长度;

第四个参数:一般置0

返回值:

recv函数返回其实际copy的字节数,如果recvcopy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0

 

int send( SOCKET s, const char FAR *buf, int len, int flags )

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据

函数参数解释:

第一个参数:指定发送端套接字描述符;

第二个参数:指明一个存放应用程序要发送数据的缓冲区;

第三个参数:指明实际要发送的数据的字节数;

第四个参数:一般置0

返回值:

如果send函数copy数据成功,就返回实际copy的字节数,如果sendcopy数据时出现错误,那么send就返回SOCKET_ERROR

注意并不是sends的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copys的发送缓冲区的剩余空间里

 

int connect(int sockfd,  const struct* addr,  socklen_t addrlen)

客户端通过调用connect()函数与TCP服务器建立连接

connect()用来将参数sockfd socket 连至参数addr 指定的网络地址

函数参数解释:

sockfd:客户端的socket描述字

add:服务器socket地址

Addrlensocket地址长度

返回值:

成功则返回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;

};

0 0
原创粉丝点击