免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3787 | 回复: 7
打印 上一主题 下一主题

进程间通信的端口问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-28 20:53 |只看该作者 |倒序浏览
5可用积分
(1) 客户端连接服务器时必须指定客户端端口吗?我认为不需要,系统会自动分配给客户端一个端口。
(2) 如果在客户端指定了端口,那么这个端口必须与服务器端端口相同吗?
下面一段小程序运行时,必须在客户端命令行上输入与服务器端相同的端口,才能连接成功,否则,拒绝连接。大家帮忙看看怎么回事,是不是程序有问题?
  1. /******* 服务器程序  (server.c) ************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>
  9. int main(int argc, char *argv[])
  10. {
  11. int sockfd,new_fd;
  12. struct sockaddr_in server_addr;
  13. struct sockaddr_in client_addr;
  14. int sin_size,portnumber;
  15. char hello[]="Hello! Are You Fine?\n";
  16. if(argc!=2)
  17. {
  18.   fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
  19.   exit(1);
  20. }
  21.   
  22. if((portnumber=atoi(argv[1]))<0)
  23. {
  24.   fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
  25.   exit(1);
  26. }

  27. /* 服务器端开始建立socket描述符 */
  28. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)   
  29. {
  30.         fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
  31.         exit(1);
  32. }

  33. /* 服务器端填充 sockaddr结构  */  
  34. bzero(&server_addr,sizeof(struct sockaddr_in));
  35. server_addr.sin_family=AF_INET;
  36. server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  37. server_addr.sin_port=htons(portnumber);
  38.   
  39. /* 捆绑sockfd描述符  */  
  40. if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
  41. {
  42.         fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
  43.         exit(1);
  44. }
  45.   
  46. /* 监听sockfd描述符  */
  47. if(listen(sockfd,5)==-1)
  48. {
  49.         fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
  50.         exit(1);
  51. }
  52. while(1)
  53. {
  54.         /* 服务器阻塞,直到客户程序建立连接  */
  55.         sin_size=sizeof(struct sockaddr_in);
  56.         if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
  57.         {
  58.                 fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
  59.                 exit(1);
  60.     }

  61.         fprintf(stderr,"Server get connection from %s\n",
  62.                                         inet_ntoa(client_addr.sin_addr));
  63.         if(write(new_fd,hello,strlen(hello))==-1)
  64.         {
  65.          fprintf(stderr,"Write Error:%s\n",strerror(errno));
  66.          exit(1);
  67.         }
  68. /* 这个通讯已经结束     */
  69.         close(new_fd);
  70. /* 循环下一个     */   
  71.   }
  72. close(sockfd);
  73. exit(0);
  74. }
复制代码
  1. /******* 客户端程序  (client.c) ************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <netdb.h>
  7. #include <sys/types.h>
  8. #include <netinet/in.h>
  9. #include <sys/socket.h>
  10. int main(int argc, char *argv[])
  11. {
  12. int sockfd;
  13. char buffer[1024];
  14. struct sockaddr_in server_addr;
  15. struct hostent *host;
  16. int portnumber,nbytes;

  17. if(argc!=3)
  18. {
  19.   fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
  20.   exit(1);
  21. }
  22.   
  23. if((host=gethostbyname(argv[1]))==NULL)
  24. {
  25.         fprintf(stderr,"Gethostname error\n");
  26.         exit(1);
  27. }

  28. if((portnumber=atoi(argv[2]))<0)
  29. {
  30.         fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
  31.         exit(1);
  32. }
  33.   
  34. /* 客户程序开始建立 sockfd描述符  */
  35. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  36. {
  37.         fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
  38.         exit(1);
  39. }

  40. /* 客户程序填充服务端的资料       */
  41. bzero(&server_addr,sizeof(server_addr));
  42. server_addr.sin_family=AF_INET;
  43. server_addr.sin_port=htons(portnumber);
  44. server_addr.sin_addr=*((struct in_addr *)host->h_addr);
  45.   
  46. /* 客户程序发起连接请求         */  
  47. if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
  48. {
  49.   fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
  50.   exit(1);
  51. }

  52. /* 连接成功了           */
  53. if((nbytes=read(sockfd,buffer,1024))==-1)
  54. {
  55.         fprintf(stderr,"Read Error:%s\n",strerror(errno));
  56.         exit(1);
  57. }
  58. buffer[nbytes]='\0';
  59. printf("I have received:%s\n",buffer);
  60. /* 结束通讯     */
  61. close(sockfd);
  62. exit(0);
  63. }
复制代码

最佳答案

查看完整内容

(1) 不需要指定客户端的端口, 系统会自动分配给客户端一个随机的端口号.(2) 你客户端要去 connect 服务器, 肯定是需要服务器的IP地址以及端口号才能够明确的指定与服务器的哪个进程进行通信. IP地址与端口号都是必需的.

论坛徽章:
0
2 [报告]
发表于 2008-09-28 20:53 |只看该作者
原帖由 kewenliang 于 2008-9-28 20:53 发表
(1) 客户端连接服务器时必须指定客户端端口吗?我认为不需要,系统会自动分配给客户端一个端口。
(2) 如果在客户端指定了端口,那么这个端口必须与服务器端端口相同吗?
下面一段小程序运行时,必须在客户端命 ...


(1) 不需要指定客户端的端口, 系统会自动分配给客户端一个随机的端口号.
(2) 你客户端要去 connect 服务器, 肯定是需要服务器的IP地址以及端口号才能够明确的指定与服务器的哪个进程进行通信. IP地址与端口号都是必需的.

论坛徽章:
0
3 [报告]
发表于 2008-09-28 20:59 |只看该作者
原帖由 scutan 于 2008-9-28 20:56 发表


(1) 不需要指定客户端的端口, 系统会自动分配给客户端一个随机的端口号.
(2) 你客户端要去 connect 服务器, 肯定是需要服务器的IP地址以及端口号才能够明确的指定与服务器的哪个进程进行通信. IP地址与端口 ...

是啊,服务器端有端口号,但是我的问题是客户端的端口号如果不和服务器端口号相同,就连接不上

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2008-09-28 20:59 |只看该作者
客户端命令行指定的是服务端监听端口,不是客户端端口(由系统分配)

论坛徽章:
0
5 [报告]
发表于 2008-09-28 21:01 |只看该作者
在客户端的:
server_addr.sin_port=htons(portnumber);
语句是设定你要连接的服务器的端口号, 与你客户端的端口号无关!

论坛徽章:
0
6 [报告]
发表于 2008-09-28 21:02 |只看该作者
原帖由 timespace 于 2008-9-28 20:59 发表
客户端命令行指定的是服务端监听端口,不是客户端端口(由系统分配)

是的。
不好意思,丢人了,笨到家了。

论坛徽章:
0
7 [报告]
发表于 2008-09-28 21:04 |只看该作者
原帖由 scutan 于 2008-9-28 21:01 发表
在客户端的:
server_addr.sin_port=htons(portnumber);
语句是设定你要连接的服务器的端口号, 与你客户端的端口号无关!

知道了,谢谢。。。。。。。。。。。

顺便问一下,怎么才能知道客户端的端口号呢?

论坛徽章:
0
8 [报告]
发表于 2008-09-28 21:12 |只看该作者
在服务器端的accept()中的cliaddr中可以看到.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP