今天重写敲了linux下的C/S模型代码。详见:【linux网络编程】server-client简单实现_StudyWinter的博客-CSDN博客
在测试server端的时候,发现输出连接的客户端的ip和port都是0,但是数据传输没有问题。很奇怪

开始排除错误:
(1)数据可以正常通信,说明socket、bind、accept以及后面的读写转换都没有问题;
(2)输出客户端的数据不对,检查输出语句,函数也没有调用错误,这里也没有问题;
(3)客户端的输出数据有问题,检查和客户端有关的语句,还是没有找到错误;
于是开始和之前写的能跑通的代码进行对比。
emm.....................终于被我找到
- // 4阻塞监听客户端;
- int cfd = accept(lfd, (struct sockaddr*)(&client_addr), &client_addr_len);
- if (cfd == -1) {
- perror("accept error");
- exit(1);
- }
在accept函数中需要传三个参数,分别是:
(1)通信的文件描述符lfd、(2)客户端的地址结构、(3)客户端地址结构的大小。
这里都没有错。但是客户端的地址大小是需要初始化的,即:
- // 4阻塞监听客户端;
- client_addr_len = sizeof(client_addr_len); // 需要加上这一句
- int cfd = accept(lfd, (struct sockaddr*)(&client_addr), &client_addr_len);
- if (cfd == -1) {
- perror("accept error");
- exit(1);
- }
那么问题来了,为什么它需要初始化呢?查man page

也就是说它是一个传入传出参数,需要传入sockaddr的地址长度,而传入的是指定存储的地址长度。