《unix网络编程》一书中的代码并不是能直接运行,有时候需要结合各方面的知识来解决,大家在这本书的时候,一定要把代码都跑通,不难你会错过很多学习的机会!

1.问题描述

本人在阅读《UNIX网络编程》中,发现运行书中服务器端程序时,返回bind error:Address already in use!

服务器端代码如下:

#include    "unp.h"
#include    <time.h>
int
main(int argc, char **argv)
{
    int                 listenfd, connfd;
    socklen_t           len;
    struct sockaddr_in  servaddr,cliaddr;
    char                buff[MAXLINE];
    time_t              ticks;
    //创建套接字
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    //初始化套接字
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;//IPv4协议
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//通配地址,一般为0
    servaddr.sin_port        = htons(13);//时间服务端口
    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    Listen(listenfd, LISTENQ);
    for ( ; ; ) {
        len = sizeof(cliaddr);
        connfd = Accept(listenfd, (SA *) &cliaddr, &len);
        printf("connection from %s, port %d/n",     inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),//将二进制地址转换成点分十进制地址
            ntohs(cliaddr.sin_port));//端口好
        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));
        Close(connfd);
    }
}

该代码的作用是将TCP套接字绑定到13号端口,以便给客户端发送日期和时间。

2. 问题解决

2.1 方法一:关闭该端口的进程

我们在运行服务器端代码的时候会出现以下错误:

root@zc:/home/zc/Documents/unp# ./daytimetcpsrv
bind error: Address already in use

于是查一下netstat来判断那个进程占用了13号端口(netstat -apn | grep 13):

root@zc-Inspiron-N4010:/home/zc/Documents/unp# netstat -apn | grep 13
tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN      6432/xinetd
tcp        0      1 192.168.191.2:57984     61.135.189.223:80       SYN_SENT    1374/fcitx      

显示xinetd占用了端口13,再来看看哪个进程占用了12端口:

root@zc-Inspiron-N4010:/home/zc/Documents/unp# sudo lsof -i:13
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd  6432 root    5u  IPv4 208386      0t0  TCP *:daytime (LISTEN)
xinetd  6432 root    6u  IPv4 208387      0t0  UDP *:daytime 

现在,通过sudo kill XXXX就能杀掉这个进程,让13号端口空闲出来了。

2.2 解决方案二:设置端口为可重用

在unp一书中,bind函数上提到过“Address already in use”的解决方案。7.5节中通过函数将其设为可重用即可。

int on = 1;
int ret = setsockopt(sock,SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

但是,在我们的程序中,还是不行!

于是,我们细想,xinetd是第一个占用13端口的,它在启动的时候没有设置这个端口可重用,自然我们的程序也没办法重用这个端口,所以,结合上述两个方案,最终的解决方案是:首先kill掉xinetd服务,然后运行我们的程序,再开启xinet,即可。

//首先执行
sudo kill 6432
//然后运行我们的程序
# ./daytimetcpsrv
//再重启xinetd
# service xinetd restart
//这个时候查看13号端口
# sudo lsof -i:13
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
daytimetc 17791 root    3u  IPv4 4484357      0t0  TCP *:daytime (LISTEN)
xinetd    17837 root    5u  IPv4 4483070      0t0  UDP *:daytime 

问题到这解决了,愉快的使用13号端口把!!

参考:

  1. Linux 套接字编程中的 5 个隐患

  2. Linux中的端口占用问题

【unix网络编程第三版】ubuntu端口占用问题的更多相关文章

  1. 【unix网络编程第三版】阅读笔记(三):基本套接字编程

    unp第三章主要介绍了基本套接字编程函数.主要有:socket(),bind(),connect(),accept(),listen()等. 本博文也直接进入正题,对这几个函数进行剖析和讲解. 1. ...

  2. 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

    本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...

  3. 【UNIX网络编程第三版】阅读笔记(一):代码环境搭建

    粗略的阅读过<TCP/IP详解>和<计算机网络(第五版)>后,开始啃这本<UNIX网络编程卷一:套接字联网API>,目前linux下的编程不算太了解,在阅读的过程中 ...

  4. 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...

  5. unix网络编程第三版源代码ubuntu下配置的问题解决

    第一步:首先下载本书配套的源码unpv13e.tar.gz 第二步:解压后进入根文件夹有一个README 4 Execute the following from the src/ directory ...

  6. 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例

    本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...

  7. UNIX 网络编程第三版

    第五章p102: ps -t  pts/6 -o pid,ppid,tty,stat,args,wchan 在我的系统上运行时出现:TTY not found linux发行版为mint17.1 改用 ...

  8. Unix网络编程第三版源码编译

    配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版 ...

  9. UNIX网络编程——ICMP报文分析:端口不可达

    ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口).在我们的例子中,跟在IP首部后面的前 ...

随机推荐

  1. 基于PHP的地址清洗调用案例-快宝开放平台

    快宝地址清洗,纠正错误地址.识别不完整地址.地址补全,并输出结构化地址数据的通用解决方案.广泛应用于快递行业,电商行业,ERP应用等. 快宝开放平台-地址清洗对接API:http://open.kua ...

  2. 3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)

      http://www.cnblogs.com/yangfengwu/p/8948935.html 学东西一定是打破沙锅学到底,有问题就解决问题,不要试图去回避或者放弃解决当前的问题,如果总是回避或 ...

  3. JavaScript 字符串(String)对象

    String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...

  4. Bootstrap3 代码-用户输入

    通过 <kbd> 标签标记用户通过键盘输入的内容. To switch directories, type cd followed by the name of the directory ...

  5. Android-Chart

    MPAndroidChart 包括折线图.曲线图.柱形图.饼图.K线图等等 我的地址:https://github.com/kongqw/MPAndroidChart 开源地址:https://git ...

  6. Dynamics CRM 本地插件注册器连CRMAn unsecured or incorrectly secured fault was received from the other party

    今天遇到个问题,在本地打开插件注册器连接到远程CRM服务器时报如下问题 但我在CRM服务器上连接注册器是可以打开的,所以不存在账号权限这类的问题了(当然我用的是超管的账号也不可能存在),最后查询得知是 ...

  7. SceneKit一个3D场景角色的代码重构

    SuperSpaceMan3D是一个以SceneKit为基础的小游戏项目,作者展示了用SceneKit开发3D游戏的强大威力.不过在实际运行时会发现有一些小bug,这里我们依次尝试将其修复 首先,当s ...

  8. C++语言编译系统提供的内部数据类型的自动隐式转换

    C++语言编译系统提供的内部数据类型的自动隐式转换规则如下: 程序在执行算术运算时,低类型自动隐式转换为高类型. 在函数调用时,将实参值赋给形参,系统隐式的将实参转换为形参的类型,并赋值给形参. 函数 ...

  9. activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)

    1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加 ...

  10. android 网络连接 HttpGet HttpPost方法

    1.本文主要介绍利用HttpGet和HtppPost方法来获取网络json数据. 代码如下: public HttpData(String Url,HttpGetDataListener listen ...