linux下非阻塞模式网络通讯模型示例分享

2019-09-30 18:53:16刘景俊

// @retval  -5 调用 getsockopt 函数失败
// @retval  -6 调用 connect 函数失败
// @retval  -7 设置连接服务端的套接字为阻塞模式失败
// @retval  -8 发送协议数据失败
// @retval  -9 等待服务端返回数据超时
// @retval -10 调用 recv 函数出错
// @retval -11 pucSRBuffer 指向的缓冲区空间不足
int
send_receive_data( unsigned char* const pucSRBuffer,
                   const unsigned short usBufferLen )
{
    // 本函数执行结果返回值
    int         iResult = 0; // 默认为零(0) 表示成功

    // 连接服务端的 TCP 套接字
    int         iServerSocket = -1;
    // 服务端IP与端口
    sockaddr_in sServerAddr;

    // I/O 状态标识值
    int iValue = 1;

    // 获取套接字错误状态码
    int       iSo_Error = 0;
    socklen_t So_Error_len = sizeof( iSo_Error );

    // 接收到的通讯协议数据长度
    unsigned short usRealReceivedData = 0;

    do // 非循环,只是为了减少分支缩进和保证进出口唯一
    {
        // 1.检查参数是否合法
        if ( ( NULL == pucSRBuffer ) ||
             (    0 >= usBufferLen ) ||
             (    0 == pucSRBuffer[0] ) )
        {
            DEBUG_OUTPUT( "Invalid parameter" );

            iResult = -1;
            break;
        }

        // 2.创建连接服务端的套接字
        iServerSocket = socket( AF_INET,     // IPv4 协议
                                SOCK_STREAM, // TCP  套接字协议类型
                                0 );         // 默认协议,通常设置为零(0)
        if ( 0 > iServerSocket )