+ -
当前位置:首页 → 问答吧 → socket程序,还是搞不好啊。

socket程序,还是搞不好啊。

时间:2010-08-21

来源:互联网

就是unp里面的例子。
贴出来代码大家看一下。

cli
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <arpa/inet.h>


  9. #define MAXLINE 200

  10. int main(int argc, char *argv[])
  11. {
  12.         int sockfd;
  13.         ssize_t n;
  14.         char buf[MAXLINE];
  15.         struct sockaddr_in servaddr;


  16.         if (argc != 2) {
  17.                 printf("usage: a.out <ip address>\n");
  18.                 exit(-1);
  19.         }

  20.         memset(buf, 0, sizeof(buf));

  21.         if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  22.                 printf("socket error.\n");
  23.                 exit(-1);
  24.         }

  25.         memset(&servaddr, 0, sizeof(servaddr));
  26.         servaddr.sin_family =  AF_INET;
  27.         servaddr.sin_port = htons(0);
  28.         /* inet_aton("127.0.0.1", &servaddr.sin_addr); */
  29.         inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
  30.        
  31.         printf("connect to:%s\n", argv[1]);
  32.         printf("ip dress is:[%4x]\n", servaddr.sin_addr.s_addr);
  33.        
  34.         if ( (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))  < 0) {
  35.                 printf("connect error.\n");
  36.                 exit(-1);
  37.         }
  38.        
  39.         scanf("%s", buf);
  40.         write(sockfd, buf, sizeof(buf));
  41.         read(sockfd, buf, sizeof(buf));

  42.         printf("%s\n", buf);

  43.         exit(0);

  44. }
复制代码
serv
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>


  8. #define MAXLINE 200

  9. int main(void)
  10. {
  11.         int listenfd, connfd;
  12.         pid_t childpid;
  13.         socklen_t clilen;
  14.         struct sockaddr_in cliaddr, servaddr;

  15.         ssize_t n;
  16.         char buf[MAXLINE];



  17.         if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  18.                 printf("socket error.\n");
  19.                 exit(-1);
  20.         }

  21.         bzero(&servaddr, sizeof(servaddr));
  22.         servaddr.sin_family = AF_INET;
  23.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  24.         servaddr.sin_port = htons(0);

  25.         if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
  26.                 printf("bind error.\n");
  27.                 exit(-1);
  28.         }

  29.         if (listen(listenfd, 1024) < 0) {
  30.                 printf("listen error.\n");
  31.                 exit(-1);
  32.         }

  33.         for ( ; ; ) {
  34.                 clilen = sizeof(cliaddr);
  35.                 printf("=====\nready for accept.\n");
  36.                 if (connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen) < 0 ) {
  37.                         printf("accept error.\n");
  38.                         exit(-1);
  39.                 }
  40.                
  41.                 if ( (childpid = fork()) == 0) {  /* child */
  42.                         close(listenfd);
  43.                         memset(buf, 0, sizeof(buf));
  44.                         while ( (n = read(connfd, buf, MAXLINE)) > 0) {
  45.                                 printf("recv from client:%s\n", buf);
  46.                                 sprintf(buf, "serv return:%s", buf);
  47.                                 write(connfd, buf, MAXLINE);
  48.                                 exit(0);
  49.                         }
  50.                 }

  51.                 close(connfd);

  52.         }

  53. }
复制代码
运行客户端时错误:
  1. ./cli 127.0.0.1
  2. connect to:127.0.0.1
  3. ip dress is:[100007f]
  4. connect error.
复制代码
server启动后用 netstat -a 查看已经在监听了。
就是客户端有问题。

请各位看一下到底哪里问题导致了 connect 出错呢。
谢谢。

作者: pandaiam   发布时间: 2010-08-21

回复 pandaiam


    服务器和客户端 显示得定义一个端口进行通信

作者: peijue   发布时间: 2010-08-21

谢谢ls回复。

我看有的教程上说,定义为0的话不就是自动选择端口吗。

作者: pandaiam   发布时间: 2010-08-21

哎呀。
把0随便设置了一个比较大的数后就可以了。

谢谢2楼,应该我没自己看教程啊。

作者: pandaiam   发布时间: 2010-08-21

借lz你这栋楼问问:我也差不多和楼主写的差不多的同样的程序。但是我搞好之后,客户端显示“拒绝连接”。我在网上查看,他们说是端口没有开启,我看也应该是,我用telnet localhost 8888测试不了,但是我telnet localhost 21,80, 8080等好几个比较熟悉都不通,我也不知道为什么。后面我又看iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 8888 -j ACCEPT
也不行。  查看那个netstat专门查看端口的命令也没看到8888端口开启。我用8888换成1507也不行。请帮忙解释一下怎么搞。

作者: wohenry84   发布时间: 2010-08-21

8888太小了。

端口号改大一点。我弄了个55555

作者: pandaiam   发布时间: 2010-08-21

............................
怎么可能呀。我的是服务器的设置为8888呀。服务器不是一般的只要大于1024端口号不就可以啦?

作者: wohenry84   发布时间: 2010-08-21

这里的scketclient的端口我才是自动分配的哦!!了一是0,服务器短如果你用0,客户怎么知道他要链接的是那个端口阿!

作者: wi1she   发布时间: 2010-08-21



QUOTE:
............................
怎么可能呀。我的是服务器的设置为8888呀。服务器不是一般的只要大于1024端 ...
wohenry84 发表于 2010-08-21 10:03




    server程序能正常启动的话应该就开始监听了。
贴一下代码吧。

作者: pandaiam   发布时间: 2010-08-21

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <strings.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #define BUFSIZE 20

  10. int strlen(char *ptr);
  11. int main()
  12. {
  13.         char buf[BUFSIZE];
  14.         int ret, clilen ;
  15.         int lisfd, newfd ;
  16.         struct sockaddr_in saddr, caddr;

  17.         bzero(&saddr, sizeof(saddr));
  18. //        memset(&saddr, 0, sizeof(struct sockaddr_in));
  19.         saddr.sin_family = AF_INET ;
  20.         saddr.sin_port = 4507 ;
  21.         saddr.sin_addr.s_addr = htons(INADDR_ANY);
  22.        
  23.         int sfd = socket(AF_INET, SOCK_STREAM, 0);
  24.         if(sfd == -1)
  25.         {
  26.                 printf("open the socket failed.\n");
  27.                 return -1 ;
  28.         }
  29.         ret = bind(sfd, (struct sockaddr *)&saddr, sizeof(struct sockaddr));
  30.         if(ret != 0)
  31.         {
  32.                 printf("bind the socket failed.\n");
  33.                 return -1 ;
  34.         }
  35.         lisfd = listen(sfd, 3);
  36. //printf("ready to accept.\n");
  37.         while(1)
  38.         {
  39.                 int sin_size = sizeof(caddr) ;
  40.                 newfd = accept(sfd, (struct sockaddr *)&caddr, &sin_size);
  41.                 printf("OK.\n");
  42.                 ret = recv(newfd, buf, strlen(buf)-1, 0);
  43.                 buf[strlen(buf)-1] = '\0';
  44.                 printf("%s\n", buf);
  45.         }
  46. }
  47. int strlen(char *ptr)
  48. {
  49.         int num = 0 ;
  50.         while(ptr != '\0')
  51.         {
  52.                 ptr++ ;
  53.                 num++ ;
  54.         }
  55. }
复制代码

作者: wohenry84   发布时间: 2010-08-21

就是listen这里有问题。客户端就是accept有问题

作者: wohenry84   发布时间: 2010-08-21