关于Linux socket 里面的 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)函数,很多书籍都把第三个参数搞错,以为第三个参数用来用来返回addr的类型,所以传个指针进去,却是表面上很像。一般情况下addrlen所指向的地址要是没有初始化(不是addrlen没有初始化,就像socklen_t a;sockelen_t addrlen=&a)都不会出现问题,但是要是你不幸运addrlen所指向的地址里存储的值是负数,那就会出现奇怪的现象,那样真的会很痛苦。所以切记什么事情都不要想当然,要是函数有返回值的,一定要通过返回值来判断函数是否执行成功。下面再贴出Linux 官方关于accept的用法
The addrlen argument is a value-result argument: the caller must ini‐
tialize it to contain the size (in bytes) of the structure pointed to
by addr; on return it will contain the actual size of the peer address.
尽信书不如无书