Linux网络编程——绑定( bind )端口需要注意的问题

所谓绑定(bind)是指别人连接我只能通过我所绑定的端口,相当于,我买了一个手机,别人要想联系我,必须要知道我的手机号码,这时候,我需要怎么办呢?我需要给手机插上电话卡,固定一个电话号码,这样别人就能通过这个电话号码联系我。手机插上电话卡,固定一个电话号码,类似于绑定(bind)的过程,绑定(bind)为了固定一个端口号,别的网络程序就可以找到这个端口号,找到这个端口号就能找到这个端口号所对应的网络应用程序。

在网络编程里,通常都是在服务器里绑定(bind)端口,这并不是说客户端里不能绑定(bind)端口,但这里需要注意的是,一个网络应用程序只能绑定一个端口( 一个套接字只能 绑定一个端口 )。

一个套接字不能同时绑定多个端口,如下:

[objc] view
plain
copy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. int main(int argc, charchar *argv[])
  9. {
  10. char server_ip[30] = "10.221.20.12";
  11. int sockfd;
  12. sockfd = socket(AF_INET, SOCK_DGRAM, 0);        //创建UDP套接字
  13. if(sockfd < 0)
  14. {
  15. perror("socket");
  16. exit(-1);
  17. }
  18. // 初始化本地网络信息
  19. struct sockaddr_in my_addr;
  20. bzero(&my_addr, sizeof(my_addr));
  21. my_addr.sin_family = AF_INET;
  22. my_addr.sin_port   = htons(8000);
  23. my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  24. // 第一次绑定端口8000
  25. int err_log;
  26. err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
  27. if(err_log != 0)
  28. {
  29. perror("bind 8000");
  30. close(sockfd);
  31. exit(-1);
  32. }
  33. // 又一次绑定别的端口9000, 会绑定失败
  34. my_addr.sin_port = htons(9000);
  35. err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
  36. if(err_log != 0)
  37. {
  38. perror("bind 9000");
  39. close(sockfd);
  40. exit(-1);
  41. }
  42. close(sockfd);
  43. return 0;
  44. }

程序编译运行后结果如下:

如果客户端想绑定端口号,一定要调用发送信息函数之前绑定( bind )端口,因为在发送信息函数( sendto, 或 write ),系统会自动给当前网络程序分配一个随机端口号,这相当于随机绑定了一个端口号,这里只会分配一次,以后通信就以这个随机端口通信,我们再绑定端口号的话,就会绑定失败。如果我们放在发送信息函数( sendto, 或 write )之前绑定,那样程序将以我们绑定的端口号发送信息,不会再随机分配一个端口号。

绑定失败例子( UDP )如下:

[objc] view
plain
copy

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. int main(int argc, charchar *argv[])
  9. {
  10. char server_ip[30] = "10.221.20.12";
  11. int sockfd;
  12. sockfd = socket(AF_INET, SOCK_DGRAM, 0);        //创建UDP套接字
  13. if(sockfd < 0)
  14. {
  15. perror("socket");
  16. exit(-1);
  17. }
  18. struct sockaddr_in dest_addr;
  19. bzero(&dest_addr, sizeof(dest_addr));
  20. dest_addr.sin_family = AF_INET;
  21. dest_addr.sin_port   = htons(8080); // 服务器的端口
  22. inet_pton(AF_INET, server_ip, &dest_addr.sin_addr);
  23. char send_buf[512] = "this is for test";
  24. // 如果前面没有绑定端口,sendto()系统会随机分配一个端口
  25. sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));//发送数据
  26. // 初始化本地网络信息
  27. struct sockaddr_in my_addr;
  28. bzero(&my_addr, sizeof(my_addr));
  29. my_addr.sin_family = AF_INET;
  30. my_addr.sin_port   = htons(8000);
  31. my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  32. // sendto()后面绑定端口,绑定失败
  33. int err_log;
  34. err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
  35. if(err_log != 0)
  36. {
  37. perror("bind 8000");
  38. close(sockfd);
  39. exit(-1);
  40. }
  41. close(sockfd);
  42. return 0;
  43. }

程序编译运行后结果如下:

源代码下载请点此处。

转自:http://blog.csdn.net/tennysonsky/article/details/44057585

时间: 2024-08-07 01:28:39

Linux网络编程——绑定( bind )端口需要注意的问题的相关文章

linux 网络编程 socket bind failed 问题解决

今天写一个简单的socket网络通讯的程序的时候,用ctrl+c结束服务器端程序之后,再次启动服务器出现了bind failed:the address already in use的错误.在网上查了一下以后找到了原因,在此记录一下.这个IBM的官网上说到了这一点:http://www.ibm.com/developerworks/cn/linux/l-sockpit/.详细介绍如下: bind 普遍遭遇的问题是试图绑定一个已经在使用的端口.该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(

Linux网络编程:绑定( bind )端口需要注意的问题

所谓绑定(bind)是指别人连接我只能通过我所绑定的端口,相当于,我买了一个手机,别人要想联系我,必须要知道我的手机号码,这时候,我需要怎么办呢?我需要给手机插上电话卡,固定一个电话号码,这样别人就能通过这个电话号码联系我.手机插上电话卡,固定一个电话号码,类似于绑定(bind)的过程,绑定(bind)为了固定一个端口号,别的网络程序就可以找到这个端口号,找到这个端口号就能找到这个端口号所对应的网络应用程序. 在网络编程里,通常都是在服务器里绑定(bind)端口,这并不是说客户端里不能绑定(bi

Linux网络编程——端口复用(多个套接字绑定同一个端口)

在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下: [objc] view plaincopy #include <stdio.h> #include <stdlib.h> #include <string.h> #inclu

Linux网络编程:端口复用

在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #i

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR. SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回. SO_L

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UDP协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket概念 7 2.2. socket类型 8 2.3. socket信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. sock

Linux网络编程

第二章 Linux网络编程 2.1客户——服务器模型 目前大多数网络应用程序在编写时都采用客户—服务器模型,假设一端是客户,另一端是服务器,让服务器提供给客户一定的服务内容.它要求有一方(服务器方)在启动执行程序后(无限期地)等待其他客户端程序与之通信.这里可以再分为两种具体类型:并发型交互与重复型交互. (1)并发型交互.在并发型交互模式下,程序的主要运作步骤如下: ·等待一个客户请求的到来: ·生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求,处理结束后,终止这个

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程--多播

一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途.多播,也称为"组播",将局域网中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据. 多播的地址是特定的,D类地址用于多播.D类