MENU

标签 C++ 下的文章

socket编程Transport endpoint is not connected错误总结

前言

最近使用C++网络编程,计划实现一个web服务(模拟http请求、支持host模式)。刚接触犯了一个低级的通信错误,导致Transport endpoint is not connected。

原因分析

在server端accept一个新的连接后返回一个文件描述符(这里就叫connect_fd),但这个文件描述符有区别于初始化socket的listen_fd文件描述符。在read函数的时候错误将listen_fd传入到函数中,最终导致Transport endpoint is not connected错误。

# read读取数据过程
while(true){
    if((nread = read(connect_fd, ptr, nleft)) < 0){
    
    }
}

# accept函数 使用的是
int accept(int listen_fd, struct sockaddr *cliaddr, socklen_t *addrlen);

sizeof知识点

前言

最近在学习C++知识,记录下一些常考的知识点。

sizeof空类

sizeof空类为1,是为了确保两个不同对象的地址的不同。

#include<iostream>

using namespace std;

class Empty{};

int main(){
    # 输出为1
    cout << sizeof(Empty) << endl;
    return 0;
}

sizeof虚函数

不管包含有多少个虚函数,只有一个虚指针vptr的大小。

#include<iostream>

using namespace std;

class VirtualFunction{
    virtual void funtion1();
    virtual void funtion2();
    virtual void funtion3();
};

int main(){
    # 输出为8
    cout << sizeof(VirtualFunction) << endl;
    return 0;
}

C++之函数指针&指针函数

指针函数

  • 指针函数:返回值是指针的函数。
# 形式如下
类型名 *函数名(函数参数列表)

# 示例代码
// 由于“*”的优先级低于“()”的优先级,因而swap首先和后面的“()”结合,也就意味着,swap是一个函数 char *swap(char *a, char *b) 等价于 char *(swap(char *a, char *b)) 
// 返回值是一个指针地址。

#include <stdio.h>
char *swap(char *a, char *b){
    b = a;
    return b;
}

int main(int argc, char *argv[]) {
    char a[10] = "hello";
    char b[10] = "world";
    printf("%s", swap(a, b));
    return 0;
}

阅读全文

C++内存对齐

字节对齐:计算机中内存大小的基本单位是字节(byte),理论上讲,可以从任意地址访问某种基本数据类型,但实际的计算机系统对基本类型数据在内存中存放的位置有限制,即它的地址必须是2、4、8、16等倍数,则就要求各种数据类型按照一定的规则在空间上排序,这就是对齐。

阅读全文