+ -
当前位置:首页 → 问答吧 → accept()得到的客户端socket信息,为什么Port是个随机的数?

accept()得到的客户端socket信息,为什么Port是个随机的数?

时间:2010-09-20

来源:互联网

我写了一个简单的服务器程序,监听客户端的连接。打印出客户端socket的信息,发现sin_port是个不确定的数字。这是为什么? 我的客户端的代码是指定了连接端口的。

服务器端的运行结果是这样的。第3个数字56603,56604....是打印的客户端socket的信息(port)---这个为什么不是一个固定的呢? 我在代码里面已经指定了服务器端在1234端口监听。还请高人指点一下!

./s
accept success :4,2,56603,127.0.0.1
accept success :4,2,56604,127.0.0.1
accept success :4,2,56605,127.0.0.1

服务器端源代码
  1. #include<sys/types.h>
  2. #include<sys/socket.h>
  3. #include<sys/wait.h>
  4. #include<netinet/in.h>
  5. #include<arpa/inet.h>
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<errno.h>
  9. #include<unistd.h>
  10. #include<string.h>
  11. int main(void){
  12.   int sock=socket(AF_INET,SOCK_STREAM,0);
  13.   sockaddr_in si,sc;
  14.   bzero((char*)&si,sizeof(si));
  15.   bzero((char*)&sc,sizeof(si));
  16.   si.sin_family=AF_INET;
  17.   si.sin_port=htons(1234);
  18.   si.sin_addr.s_addr=/*htonl(INADDR_ANY);*/inet_addr("127.0.0.1");
  19.   bind(sock,(sockaddr*)&si,sizeof(sockaddr));
  20.   listen(sock,2);
  21.   int fd;
  22.   socklen_t slen=sizeof(sockaddr);
  23.   while(fd){
  24.     fd=accept(sock,(sockaddr*)&sc,&slen);
  25.     if(fd>=0){
  26.       in_addr ad={sc.sin_addr.s_addr};
  27.       printf("accept success :%d,%d,%d,%s\n",
  28.         fd,sc.sin_family,ntohs(sc.sin_port),inet_ntoa(ad));
  29.       write(fd,"server response\n",15);
  30.       close(fd);
  31.     }else{
  32.       printf("accept error %m,%d\n",errno);
  33.     }
  34.   }
  35.   close(sock);
  36.   return 0;
  37. }
复制代码

作者: kgisme170   发布时间: 2010-09-20

>>我的客户端的代码是指定了连接端口的。
你指定的端口是服务器端的呀。
客户端的端口你指定了?

作者: lenovo   发布时间: 2010-09-20

你客户端没bind就connect了吧,这样系统随便给你绑一个IP和端口

作者: liwangli1983   发布时间: 2010-09-20



QUOTE:
我写了一个简单的服务器程序,监听客户端的连接。打印出客户端socket的信息,发现sin_port是个不确定的数字 ...
kgisme170 发表于 2010-09-20 23:40



服务端只能决定服务方的侦听端口,无法决定客户端的端口。客户端程序如果没有在connect前bind固定端口的话,则其端口是按顺序往下分配的可用端口,与服务端的程序没有半点关系,这是基本常识啊。

作者: CountOnMyself   发布时间: 2010-09-20