一个端口号可以同时被两个进程绑定吗?( 四 )

gcc 123.c -o runsudo cp run /sbinsudo chmod 777 /sbin/run测试:编译为run程序,放到一个自己PATH环境变量里的某个路径里,例如$HOME/bin,运行run,然后telnet localhost 10013看结果 。
第一步 运行程序,此时程序阻塞在accept()这个位置 。

一个端口号可以同时被两个进程绑定吗?

文章插图
 
第二步 重新打开一个终端,执行以下命令 。
一个端口号可以同时被两个进程绑定吗?

文章插图
 
第三步: 可以看到次异步运行的程序退出,并打印了bind call OK! 说明子进程被执行,并且成功绑定了端口10013,验证了第一种情况 。
一个端口号可以同时被两个进程绑定吗?

文章插图
 
  1. 第二种情况我没有环境测,所以就不给测试程序了,大家有条件的可以自己写一个来测试一下 。
  2. 测试第三种情况的程序 读取本地ip地址

一个端口号可以同时被两个进程绑定吗?

文章插图
 
ifconfig
可以得到本地地址为:
eth0 : 192.168.43.171lo      : 127.0.0.1测试代码
#include <netinet/in.h> #include <sys/socket.h> #include <time.h> #include <stdio.h> #include <string.h> #define MAXLINE 100 int main(int argc, char** argv) {    int fd1,fd2;    struct sockaddr_in servaddr1,servaddr2;    char buff[MAXLINE+1];    time_t ticks;    unsigned short port;    int flag=1,len=sizeof(int);    port=10013;    if( (fd1=socket(AF_INET,SOCK_STREAM,0)) == -1)    {        perror("socket");        exit(1);    }    if( (fd2=socket(AF_INET,SOCK_STREAM,0)) == -1)    {        perror("socket");        exit(1);    }    bzero(&servaddr1,sizeof(servaddr1));    bzero(&servaddr2,sizeof(servaddr2));    servaddr1.sin_family=AF_INET;    servaddr2.sin_family=AF_INET;    if( inet_pton(AF_INET, "127.0.0.1", &servaddr1.sin_addr) <= 0)  {   printf("inet_pton() call error:127.0.0.1n");   exit(1);  }  if( inet_pton(AF_INET, "192.168.43.171", &servaddr2.sin_addr) <= 0)  {   printf("inet_pton() call error:128.160.1.230n");   exit(1);  }  servaddr1.sin_port=htons(port);  servaddr2.sin_port=htons(port);   if( setsockopt(fd1, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)  {   perror("setsockopt");   exit(1);  }  if( setsockopt(fd2, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)  {   perror("setsockopt");   exit(1);  }  if( bind(fd1,(struct sockaddr*)&servaddr1,sizeof(servaddr1)) == -1) {   perror("bind fd1");   exit(1);  }  if( bind(fd2,(struct sockaddr*)&servaddr2,sizeof(servaddr2)) == -1) {   perror("bind fd2");   exit(1);  }  printf("bind fd1 and fd2 OK!n");   /*put other process here*/  getchar();  exit(0);/* end */ } 执行结果
一个端口号可以同时被两个进程绑定吗?

文章插图
 
结果
  1. 由于第四种情况只用于UDP的多播,和TCP的使用没多大关系,所以就不写测试例子了 。自己有兴趣的可以写 。
更多Linux 嵌入式 知识,请关注 一口Linux




推荐阅读