C++ Socket(三)

IO函数

主要的IO函数有
read()/write()
recv()/send()
recvmsg()/sendmsg()
readv()/writev()

write()函数

#include <unistd.h>
ssize_t write (int __fd, const void *__buf, size_t __n);
将长度为__n的字节从__buf写入__fd指向的文件中。返回值如果与__n相同则表示成功,否则表示失败。

__fd是文件描述符。STDIN_FILENO(值为0)表示当前进程的标准输入;STDOUT_FILENO(值为1)表示当前进程的标准输出;STDERR_FILENO(值为2)表示标准错误输出。

read()函数

#include <unistd.h>
ssize_t read (int __fd, void *__buf, size_t __nbytes);
成功返回实际读到的字节数(小于等于__nbytes),0表示已读到文件尾无数据可读,出错返回-1。

#include <iostream>
#include<unistd.h>
#include <fcntl.h>
#include <stdlib.h>
using namespace std;

#ifndef FILE_TAG
#define FILE_TAG "/home/thinking/CPP/test.txt"
#endif

int main()
{
    cout << "Hello World!" << endl;

    int in_fd=open(FILE_TAG,O_RDONLY);
    int tmp_read_num;
    char buf[20];
    while((tmp_read_num=read(in_fd,buf,sizeof(buf)))>0){
        write(1,buf,tmp_read_num);
    }

    cout<<(close(in_fd)==0?"Close success":"Close failed")<<endl;
    return 0;
}


recv()

#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);

此函数用于从套接字文件描述符中接收数据放到缓冲区中。成功返回实际读取数据的长度,失败返回-1
前三个参数很容易理解,最后一个参数__flags表示接收数据的方式,可选值如下(这些可选值可以组合使用):
MSG_DONTWAIT:将此次IO操作设置成非阻塞方式,立即读取当前套接字文件中的内容(即使没有任何内容)并立刻返回,不等待输入。
MSG_ERRQUEUE:从套接字错误队列中接收错误消息。
MSG_OOB:接收带外数据
MSG_PEEK:只读取,不清空数据。(默认情况下,数据从套接字文件里被读取之后将会被内核丢弃,不允许反复读取同一数据)
MSG_TRUNC:如果传入的缓冲区大小小于待读取的数据,系统将自动按找缓冲区大小截取数据并读出,其他数据则被丢弃(默认情况下,本次已读取的数据才会被内核丢弃,本次没读完的数据可以在下次再读取)。
MSG_WAITALL:阻塞操作,如果套接字文件中暂时没有足够的数据(即文件中的数据不足以充满缓冲区)则等待,直到数据填满缓冲区才读取并返回。

关于MSG_WAITALL,如果出现一下三种情况,即使缓冲区没读满也会返回:
1、捕获一个信号量
2、连接终止,此时函数将返回0
3、套接字上发生错误

这个函数错误码如下

send()


#include<sys/types.h>
#include<sys/socket.h>
ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);

此函数会将__buf中大小为__n的数据按照__flags指定的方式发送出去。其中__flags与recv()函数中的含义是一致的。send()之前套接字必须连接建立成功!
返回值是成功发送的数据长度。由于每次发送都有可能有部分数据没有成功地发送出去,所以可能需要根据返回值重发。
错误返回-1,错误码如下:


readv()和writev()

用于批量读/写(即对有多个缓冲区组成的缓冲区向量进行操作)

recvmsg()和sendmsg

这两个函数也可以完成批量读/写,sendmsg的操作方式由形参列表的第三个参数int __flags指定,recvmsg的操作方式形参列表的第二个参数msghdr* msg的成员变量msg_flags指定。
这两个函数与前面的函数不同的是,这两个函数可以选择对方的IP地址(即从指定的连接中读取数据)


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C socket是一种用于在计算机网络中进行通信的编程接口。它提供了一组函数,可以创建、绑定、监听和接受连接,以及发送和接收数据。在使用C socket时,可以使用socket函数创建一个套接字,并指定协议族(AF_INET)、套接字类型(SOCK_STREAM)和协议(IPPROTO_TCP)。如果创建套接字失败,可以通过检查返回值来处理错误。 在建立socket后,可以使用bind函数将自身的IP地址和端口号绑定到socket上,这样可以使其他计算机通过网络连接到该socket。之后,可以使用listen函数监听该socket,等待其他计算机的连接请求。一旦有连接请求到达,可以使用accept函数接受连接,并创建一个新的套接字(clientSocket)来处理与该客户端的通信。 在与客户端的通信过程中,可以使用recv函数接收客户端发送的数据,并使用send函数向客户端发送数据。通信完成后,可以使用closeSocket函数关闭与客户端的连接。如果不需要等待任何客户端连接,可以直接调用closeSocket函数关闭自身的套接字。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++学习之Socket](https://blog.csdn.net/weixin_42299076/article/details/124828768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值