免费注册 查看新帖 |

Chinaunix

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

[网络] 简单的socket程序,【Connection refused】,求解答 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-08 17:46 |只看该作者 |倒序浏览
刚开始学习网络编程,写了一个简单的程序就出错了,程序如下:

server.cpp

  1. #include <sys/socket.h>
  2. #include <stdio.h>
  3. #include <error.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/wait.h>
  8. #include <stdlib.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. int main(int argc, char *argv[])
  12. {
  13.     if(argc != 2)
  14.     {
  15.         fprintf(stderr, "argus error\n");
  16.         exit (-1);
  17.     }
  18.     // creat socket
  19.     int socketFd = socket(AF_INET,SOCK_STREAM,0); // creat a socket
  20.     if(socketFd < 0)
  21.     {
  22.         fprintf(stderr, "can not open socket\n");
  23.         exit (-1);
  24.     }
  25.     fprintf(stdout ,"socket: %d\n",socketFd);

  26.     // bind
  27.     struct sockaddr_in serverAddr;
  28.     struct sockaddr_in clientAddr;
  29.     int portNumer = atoi(argv[1]);
  30.     if(portNumer < 0)
  31.     {
  32.         fprintf(stderr,"portNumer error\n");
  33.         exit (-1);
  34.     }
  35.     fprintf(stdout ,"portNum: %d\n",portNumer);
  36.     bzero(&serverAddr,sizeof(struct sockaddr_in));
  37.     serverAddr.sin_family = AF_INET;
  38.     serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  39.     serverAddr.sin_port = htons(portNumer);
  40.     int bindRet = bind(socketFd,(struct sockaddr *) (&serverAddr),sizeof(struct sockaddr));
  41.     if(bindRet < 0)
  42.     {
  43.         fprintf(stderr,"bind error\n");
  44.         exit (1);
  45.     }


  46.     // listen socket
  47.     if(listen(socketFd,5) < 0)
  48.     {
  49.         fprintf(stderr,"listen error\n");
  50.         exit (1);
  51.     }
  52.     char hello[]  = "hello,world\n";
  53.     while (1)
  54.     {
  55.         socklen_t tmpSize = sizeof(struct sockaddr_in);
  56.         int newFd = accept(socketFd,(struct sockaddr *)(&clientAddr),&tmpSize);
  57.         fprintf(stdout, "newFd: %d\n",newFd);
  58.         if(newFd < 0)
  59.         {
  60.             fprintf(stderr,"accept error\n");
  61.             exit (-1);
  62.         }
  63.         fprintf(stdout,"Server get con from %s\n", inet_ntoa(clientAddr.sin_addr));
  64.         if(write(newFd,hello,strlen(hello)) < 0)
  65.         {
  66.             fprintf(stderr,"write error\n");
  67.             exit (-1);
  68.         }
  69.         close(newFd);
  70.     }
  71.     close(socketFd);
  72.     exit (0);
  73. }
复制代码
client

  1. #include <sys/socket.h>
  2. #include <stdio.h>
  3. #include <error.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/wait.h>
  8. #include <stdlib.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. #include <netdb.h>
  12. #include <errno.h>
  13. int main(int argc, char *argv[])
  14. {
  15.     if(argc != 3)
  16.     {
  17.         fprintf(stderr, "argus error\n");
  18.         exit (-1);
  19.     }
  20.     // get host name
  21.     struct hostent *host = gethostbyname(argv[1]);
  22.     if(host == NULL)
  23.     {
  24.         fprintf(stderr, "can not get host name\n");
  25.         exit (-1);
  26.     }
  27.     char str[64];
  28.     fprintf(stdout, "ip address is %s\n", inet_ntop(host->h_addrtype,host->h_addr,str,sizeof(str)));



  29.     // get portnumber
  30.     int portNumer = atoi(argv[1]);
  31.     if(portNumer < 0)
  32.     {
  33.         fprintf(stderr,"portNumer error\n");
  34.         exit (-1);
  35.     }

  36.     // creat socket
  37.     int socketFd = socket(AF_INET,SOCK_STREAM,0); // creat a socket
  38.     if(socketFd < 0)
  39.     {
  40.         fprintf(stderr, "can not open socket\n");
  41.         exit (-1);
  42.     }
  43.     fprintf(stdout ,"socket: %d\n",socketFd);

  44.     // get server info
  45.     struct sockaddr_in serverAddr;
  46.     bzero(&serverAddr,sizeof(struct sockaddr_in));
  47.     serverAddr.sin_family = AF_INET;
  48.     serverAddr.sin_port = htons(portNumer);
  49.     serverAddr.sin_addr = *((struct in_addr *)host->h_addr);
  50. //    inet_pton(AF_INET,host->h_addr,serverAddr.sin_addr);

  51.     // connect to server
  52.     if(connect(socketFd,(struct sockaddr*)(&serverAddr),sizeof(struct sockaddr)) == -1)
  53.     {
  54.         fprintf(stderr, "connect error: %s\n",strerror(errno));
  55.         exit (-1);
  56.     }
  57.     char buffer[1024];
  58.     int readSize  = read(socketFd,buffer,sizeof(buffer));
  59.     if(readSize < 0)
  60.     {
  61.         fprintf(stderr, "read error\n");
  62.         exit (-1);
  63.     }
  64.     fprintf(stdout, "readBuffer: %s\n",buffer);
  65.     close(socketFd);
  66.     exit (0);
  67. }
复制代码
在同一台机器上,用如下方法启动server
./server 63002
之后运行
nc 127.0.0.1 63002 ==> 显示 hello, world


telnet 127.0.0.1 63002 显示如下:
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
hello,world
Connection closed by foreign host.


运行:./client 127.0.0.1 63002,显示如下信息

ip address is 127.0.0.1
socket: 3
connect error: Connection refused

求解答,谢谢

论坛徽章:
0
2 [报告]
发表于 2013-05-09 08:36 |只看该作者
找到问题了,取端口的时候,应该用argv[2]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP