socket()函数
socket()函数的原型如下,这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。
函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。SOCK_DGRAM:支持UDP连接(无连接状态的信息)、SOCK_STEAM:TCP连接,提供序列化的、可靠的、双向连接的字节流。
函数socket()的第3个参数protocol用于制定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。
参考链接:https://blog.csdn.net/xc_tsao/article/details/44123331
bind()函数
在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。
函数原型
bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要。绑定的函数原型如下:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
bind()函数有3个参数。
第1个参数sockfd是用socket()函数创建的文件描述符。
第2个参数my_addr是指向一个结构为sockaddr参数的指针,sockaddr中包含了地址、端口和IP地址的信息。在进行地址绑定的时候,需要弦将地址结构中的IP地址、端口、类型等结构struct sockaddr中的域进行设置之后才能进行绑定,这样进行绑定后才能将套接字文件描述符与地址等接合在一起。
第3个参数addrlen是my_addr结构的长度,可以设置成sizeof(struct sockaddr)。使用sizeof(struct sockaddr)来设置套接字的类型和其对已ing的结构。
bind()函数的返回值为0时表示绑定成功,-1表示绑定失败。
参考链接:https://blog.csdn.net/xc_tsao/article/details/44132965#comments_13029247
setsockopt()函数
setsockopt()函数用于任意类型、任意状态套接口的设置选项值,其作用和使用说明如下:
int setsockopt(SOCKET s, int level, int optname, const char FAR *optval, int optlen);
参数说明:
-
s:
标识一个套接口的描述字。
-
level:
被设置的选项的级别, 目前仅支持SOL_SOCKET和IPPROTO_TCP层次,想要套接字级别上设置选项,就必须把level设置为 SOL_SOCKET。
-
optname:
需设置的选项
-
optval:
指向存放选项值的缓冲区。
-
optlen:
optval 缓冲区的长度。
-
返回值:
若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
参考链接:https://blog.csdn.net/c_base_jin/article/details/94353956
recvfrom()函数
函数说明:通过socket文件描述符从对方接受数据,用于UDP协议
#include <winsock.h>
int recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen);
参数说明:
s:标识一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式。
from:(可选)指针,指向装有源地址的缓冲区。
fromlen:(可选)指针,指向from缓冲区长度值。
注释:
本函数由于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。
所以使用时要先声明一个sockaddr_in的结构变量,但是不需要初始赋值!
这个变量就是用来接收对方的IP信息的!
sendto()函数
函数说明:通过socket文件描述符发送数据到对方,用于UDP协议
ssize_t sendto (int s, const void *buf, size_t len,int flags, const struct sockaddr *to ,socklen_t tolen);
传入值说明:
s:socket文件描述符;
buf:发送数据的首地址;
len:发送数据的长度;
flags:0:默认方式发送数据;
to:存放目的主机IP地址和端口信息;
tolen:to的长度,可设为sizeof(struct sockaddr)
函数返回值:
成功:实际发送的字节数,失败:-1,失败原因存在于error中