socket send函数系列,彻底弄懂socket发送函数,可做参考手册

目录

1.系统调用流程

2 发送函数系列

2.1 send函数

2.2 sendto函数

2.3 sendmsg函数

2.4 write函数

2.5 writev函数


1.系统调用流程

图 1


2 发送函数系列

2.1 send函数

send函数为套接字发送函数,需套接字进行connect操作才能使用。

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送数据长度

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

2.2 sendto函数

sendto函数为套接字发送函数,不管套接字是否进行connect操作都能使用。

  • 未connect:

dest_addr:对端套接字地址

addrlen:套接字地址长度

  • 已connect:

dest_addr:NULL

addrlen:0

#include <sys/types.h>  
#include <sys/socket.h>

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,             
const struct sockaddr *dest_addr, socklen_t addrlen); 

参数:
sockfd:套接字文件描述符 
buf:发送缓冲区 
len:发送数据长度 
flags:标识 
dest_addr:对端套接字地址 
addrlen:对端套接字地址长度  

返回值:
成功:返回发送的字节数 
失败:返回-1,并设置errno


2.3 sendmsg函数

sendmsg函数为套接字批量发送函数,不管套接字是否进行connect操作都能使用。

#include <sys/types.h>  
#include <sys/socket.h>

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

参数:
sockfd:套接字文件描述符
msg:发送消息体
flags:标识

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

图 2 struct msghdr结构体解析


sendmsg发送原理:

  • void *msg_name指定对端套接字地址,socklen_t msg_namelen为套接字地址长度,如果套接字已经进行connect操作,可以不指定对端套接字地址。
  • struct iovec *msg_iov为发送单元结构体指针,指向一块连续的struct iovec区域,每一个区域为一个发送缓冲区,可以通过size_t msg_iovlen指定一次发送的缓冲区数量,从而完成批量发送操作。
  • struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度。

图 3

使用示例:

struct sockaddr_in peer;
memset(&peer, 0, sizeof(peer));        
peer.sin_family = AF_INET;        
peer.sin_addr.s_addr = inet_addr(IP);        
peer.sin_port = htons(PEER_PORT);

struct iovec iov[2] = {0};        
iov[0].iov_base = send_buf1;        
iov[0].iov_len = strlen(REQUEST_STR1);        
iov[1].iov_base = send_buf2;        
iov[1].iov_len = strlen(REQUEST_STR2); 

struct msghdr msg = {0};        
msg.msg_name = &peer;       
msg.msg_namelen = sizeof(peer);        
msg.msg_iov = iov;        
msg.msg_iovlen = 2;
        
sendmsg(sockfd, &msg, 0);


2.4 write函数

write函数为文件描述写操作,可用于套接字发送操作,write和send区别为send函数需要指定flags标识。

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

参数:
fd:套接字文件描述符
buf:发送缓冲区
count:发送数据长度

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

2.5 writev函数

writev函数为文件描述写操作,writev可用于套接字批量发送操作,writev套接字进行connect操作才能使用。

#include <sys/uio.h>

ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

参数:
fd:套接字文件描述符
iov:发送单元结构体指针
iovcnt:发送单元数量

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno


writev发送原理:

  • struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度
  • int iovcnt为发送单元个数
  • writev函数和sendmsg发送操作类似


使用示例:

struct iovec iov[2] = {0};        
iov[0].iov_base = send_buf1;        
iov[0].iov_len = strlen(REQUEST_STR1);        
iov[1].iov_base = send_buf2;        
iov[1].iov_len = strlen(REQUEST_STR2);      
writev(sockfd, iov, 2);

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用 `send` 函数发送字符串。首先,您需要连接到您想要发送字符串的远程主机。然后,可以使用 `send` 函数将字符串发送到远程主机。举个例子: ``` #include <stdio.h> #include <string.h> #include <sys/socket.h> int main() { // 建立 socket int sock = socket(AF_INET, SOCK_STREAM, 0); // 连接到远程主机 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1234); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 发送字符串 char *str = "Hello, World!"; send(sock, str, strlen(str), 0); // 关闭 socket close(sock); return 0; } ``` 在上面的代码中,首先使用 `socket` 函数建立了一个 socket,然后使用 `connect` 函数连接到远程主机。最后,使用 `send` 函数发送了字符串 "Hello, World!"。 需要注意的是, `send` 函数并不会保证所有的数据都会被发送出去。如果缓冲区已满, `send` 函数可能会发送一部分数据,剩下的数据会在缓冲区有足够的空间时再发送。因此,您可能需要多次调用 `send` 函数来完成发送。 另外,如果想要发送的是一个字符,可以使用 ### 回答2: socket库中的send函数是用来发送数据的。当发送字符时,需要将字符转换为字节序列,然后再通过send函数将字节序列发送出去。 具体的操作步骤如下: 1. 导入socket库:在Python程序中使用socket库的send函数之前,首先需要导入socket库。 ```python import socket ``` 2. 创建socket对象:使用socket库的socket函数创建一个socket对象。 ```python client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 3. 连接服务器:使用socket对象的connect函数连接服务器。 ```python server_address = ('localhost', 8080) client_socket.connect(server_address) ``` 4. 将字符转换为字节序列:使用Python的字符串的encode方法将字符转换为字节序列。 ```python message = 'Hello, world!' message_bytes = message.encode('utf-8') ``` 5. 发送字节序列:使用socket对象的send函数发送字节序列。 ```python client_socket.send(message_bytes) ``` 6. 关闭连接:发送完数据后,需要关闭与服务器的连接。 ```python client_socket.close() ``` 以上就是使用socket库的send函数发送字符的具体步骤。需要注意的是,字符在发送之前需要转换为字节序列,且需要选择合适的编码方式进行转换。 ### 回答3: socket库的send函数是用来发送数据的,在发送字符时,需要将字符转换为字节并传递给send函数。具体的步骤如下: 1. 首先,通过socket库的socket函数创建一个套接字。例如,可以使用如下代码创建一个TCP套接字: ```python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 2. 接下来,使用socket库的connect函数连接到服务器。例如,如果要连接到本地主机的特定端口,可以使用如下代码: ```python s.connect(('localhost', 8888)) ``` 3. 然后,使用send函数发送字符。在发送之前,需要将字符转换为字节。可以使用字符串对象的encode方法将字符转换为字节。例如,发送字符"Hello",可以使用如下代码: ```python message = "Hello" s.send(message.encode()) ``` 这里,encode方法将字符串转换为默认编码的字节序列。 4. 最后,使用socket库的close函数关闭套接字。例如,可以使用如下代码关闭套接字: ```python s.close() ``` 综上所述,通过将字符转换为字节,并将字节传递给send函数,可以发送字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网心球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值