linux下如何触发socket的可写状态

学习 linux高性能服务器编程 的时候遇到这样一个困惑,是关于io复用中的可写事件如何触发。书中说对于一个socket可写的情况之一是该socket对应的内核发送缓存区有数据待发送(是因为我们调用了send或者write之类的函数向该sockfd写入了数据的原因嘛?),那是不是说明如果我们想要向一个socket写入数据的时候不能先通过判断该socket触发了可写事件(比如pollout )再调用send函数。emmm有点混乱了,但主要我是想问是send函数的调用导致了socket的可写状态,还是socket需要先处于可写状态我们才能够调用send函数💔

如果一个socket能读也能写,那么在send前先判断是否可写,可写状态下再去发送。


给你看一套asio 的客户机 与服务器

#include <iostream>
using namespace std;
#include <boost/asio.hpp>
//using namespace boost::asio;

void main()
{
    boost::asio::io_service io_service;
    boost::asio::ip::udp::socket udp_socket(io_service);
    boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string("192.168.0.141"), 2000);

    udp_socket.open(local_add.protocol());
    udp_socket.bind(local_add);

    char receive_str[1024] = { 0 };
    while (1)
    {
        boost::asio::ip::udp::endpoint  sendpoint;
        udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), sendpoint);
        cout << "收到" << sendpoint.address().to_string() <<":"<< receive_str << endl;
        udp_socket.send_to(boost::asio::buffer("服务端返回success"), sendpoint);
        memset(receive_str, 0, 1024);

    }
}
#include <iostream>
using namespace std;
#include <boost/asio.hpp>
//using namespace boost::asio;

void main()
{
    boost::asio::io_service io_service;
    boost::asio::ip::udp::socket udp_socket(io_service);
    boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string("192.168.0.141"), 2000);

    udp_socket.open(local_add.protocol());

    char receive_str[1024] = { 0 };//字符串
    while (1)
    {
        boost::asio::ip::udp::endpoint  sendpoint;//请求的IP以及端口
        string s;
        cin >> s;
        udp_socket.send_to(boost::asio::buffer(s.c_str(),s.size()), local_add);
        udp_socket.receive_from(boost::asio::buffer(receive_str, 1024), local_add);//收取
        cout << "收到" << receive_str << endl;
        memset(receive_str, 0, 1024);//清空字符串
    }
}