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