linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机

1.recv触发情况

用错了socket,把监听socket 和 连接socket 错误使用。实例如下:

for(;;){
        socklen_t len = sizeof(client_address);
        connfd = accept(listenfd, (struct sockaddr *)&client_address, &len);
        if(connfd < 0){
            printf("accept error: %s\n", strerror(errno));
        }
        printf("server get connection from %s\n", inet_ntop(AF_INET, &client_address.sin_addr, buff, sizeof(buff)));

        if((n = read(listenfd, message, 1024)) == -1){
            printf("read error: %s\n", strerror(errno));
            exit(1);
        }
        message[n] = '\0';
        printf("receive the message of client: %s\n", message);
        close(connfd);

    }

上面的代码为server端的接收client链接请求并显示client传过来的信息, accept函数成功后返回一个内核生成的一个全新的描述符 赋值给connfd, 所以后面调用read()函数时, 第一个参数应该是connfd 而不是 listenfd。 所以代码第9行应该改为

if((n = read(connfd, message, 1024)) == -1){ 

2.shutdown触发情况

客户端socket 已经关闭的情况,服务器端socket 调用shutdown 则会出现这个错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值