socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数

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中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值