免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10194 | 回复: 9

[Linux] linux下socket编程 总是connect失败 [复制链接]

论坛徽章:
0
发表于 2014-04-06 17:48 |显示全部楼层
如题,客户端和服务端都是在本机,但客户端总是connect失败,端口设置的是6666,ip设置的是127.0.0.1,服务端已经在监听了。错误码是111.
还有,我用的是vmware,,不能联网,不知道跟这个有没有关系。谢谢各位了!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-04-06 18:29 |显示全部楼层
执行下“ifconfig -a”, 能看到127.0.0.1这个IP吗?如果可以,那就是代码问题了,最好贴出来。

论坛徽章:
0
发表于 2014-04-06 19:37 |显示全部楼层
能看到哈,在“lo”里。我的代码
// 客户端
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

typedef struct sockaddr SA;

int main()
{
  struct sockaddr_in client_addr;
  char str[1024];
  int client_fd;
  client_fd = socket(AF_INET, SOCK_STREAM, 0);
  if(client_fd == -1)
    {
      printf("socekt is failed!...\n");
      return -1;
    }
  printf("socket is ok!...\n");

  bzero(&client_addr, sizeof(client_addr));
  client_addr.sin_family = AF_INET;
  client_addr.sin_port = htonl(6666);
  client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

  if(-1 == connect(client_fd, (SA *)&client_addr, sizeof(client_addr)) )
    {
      printf("connect is failed!...\n");
      printf("%d\n", errno);
      return -1;
    }
  printf("connect is ok!...\n");

  if(read(stdin, str, 1024) < 0)
    {
      printf("read is failed!...\n");
      return -1;
    }
  while(1)
    {
      if(write(client_fd, str, strlen(str)) < 0)
      {
         printf("write is failed!...\n");
         return -1;
      }
    }

  close(client_fd);
  return 0;
}

//服务端
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

typedef struct sockaddr SA;

int main()
{
  int serverfd, acceptfd;
  struct sockaddr_in server_addr;
  char buf[1024];
  serverfd = socket(AF_INET, SOCK_STREAM, 0);
  if(serverfd == -1)
    {
      printf("socket is failed!...\n");
      return -1;
    }
  printf("socket is ok!...\n");

  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_port = htons(6666);

  if(-1 == bind(serverfd, (SA *)&server_addr, sizeof(server_addr)))
    {
      printf("bind is failed!...\n");
      return -1;
    }
  printf("bind is ok!...\n");

  if(-1 == listen(serverfd, 1024))
    {
      printf("listen is failed!...\n");
        return -1;
    }
  printf("listen is ok!...\n");

  int size;
  size = sizeof(server_addr);
  while(1)
    {
      if(-1 == ( acceptfd = accept(serverfd, (SA *)&server_addr, &size) ))
      {
         printf("accept is failed!...\n");
         return -1;
      }
      printf("accept is ok!...\n");
      read(acceptfd, buf, 1024);
      write(stdout, buf,1024);
      close(acceptfd);
    }
  
  close(serverfd);
  return 0;
}

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-04-06 20:02 |显示全部楼层
回复 3# danieluec
  1. client_addr.sin_port = htonl(6666);
复制代码
改为
  1. client_addr.sin_port = htons(6666);
复制代码
先试下。



   

论坛徽章:
0
发表于 2014-04-06 20:30 |显示全部楼层
厉害!问题就是出到这了,多谢!!

论坛徽章:
0
发表于 2014-04-06 20:35 |显示全部楼层
不过还是想问一下,两端比较保持一致吗?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-04-06 20:45 |显示全部楼层
回复 6# danieluec
没看懂这个问题。。。


   

论坛徽章:
0
发表于 2014-04-06 20:53 |显示全部楼层
原来的错误代码中,客户端用的是htonl,服务段用的是htons。
客户端和服务段必须要一致吗?比如已经改好的这种,都用的是htons

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-04-06 21:34 |显示全部楼层
回复 8# danieluec
函数是否一致是表象,关键是要让端口数值上相等,否则TCP连接怎能建立?你printf下htonl(6666)和htons(6666),它俩的数值根本不相等。。。


   

论坛徽章:
0
发表于 2014-04-07 17:35 |显示全部楼层
明白了!多谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP