免费注册 查看新帖 |

Chinaunix

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

[网络] linux socket 编程 connect 失败 [复制链接]

论坛徽章:
0
发表于 2015-07-29 10:38 |显示全部楼层
server到listen 一切正常,client 到 connect 就显示fail。可以ping通 127.0.0.1  请各路大神帮忙看看。
  1. /* client */

  2. #include<string.h>
  3. #include<iostream>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<stdlib.h>
  7. #include<netinet/in.h>
  8. #include<sys/time.h>
  9. #include<arpa/inet.h>
  10. #include<unistd.h>
  11. #include<sys/select.h>

  12. #define PORT 6000
  13. #define MAX_SIZE 1420
  14. using namespace std;

  15. void seconds_sleep(unsigned seconds){
  16.     struct timeval tv;
  17.     int errno;
  18.     tv.tv_sec=seconds;
  19.     tv.tv_usec=0;
  20.     int err;
  21.     do{
  22.        err=select(0,NULL,NULL,NULL,&tv);
  23.     }while(err<0 && errno==0);
  24. }


  25. int main()
  26. {
  27.         int confd;
  28.         int recbytes;
  29.         socklen_t sin_size;
  30.         char send_buff[MAX_SIZE] = {0};
  31.         char recv_buff[MAX_SIZE] = {0};
  32.         char ntoa;
  33.         struct sockaddr_in s_add , c_add ;
  34.         timeval *begin;
  35.         cout<<"Client start."<<endl;
  36.         strcpy (send_buff,"Hi,I am mark. ");

  37.         if ( confd = socket( AF_INET , SOCK_STREAM , 0) == -1 ) // create socket
  38.         {
  39.                 cout<<"Socket fail!"<<endl;
  40.                 return -1;
  41.         }
  42.         cout<<"Socket OK!"<<endl;
  43.        
  44.         bzero( &s_add , sizeof(struct sockaddr_in)); // init s_add
  45.         s_add.sin_family = AF_INET ;
  46.         s_add.sin_addr.s_addr = inet_addr("127.0.0.1");
  47.         // ntoa = (s_add.sin_addr);
  48.         s_add.sin_port = htons(PORT);
  49.         cout<<"s_addr = "<<s_add.sin_addr.s_addr<<",port:"<<s_add.sin_port<<endl;       

  50.         if (-1 == connect( confd , (struct sockaddr *)(&s_add),sizeof(struct sockaddr)))// connect
  51.         {
  52.                 cout<<"connect fail!"<<endl;
  53.                 return -1;
  54.         }       
  55.         cout<<"Connected!"<<endl;               
  56.         if ( -1 == send( confd , send_buff , MAX_SIZE , 0 ) ) // send
  57.         {
  58.                 cout<<"Send fail!"<<endl;
  59.                 return -1;
  60.         }
  61.         if ( -1 == recv( confd , recv_buff , MAX_SIZE , 0 ) ) // recv               
  62.         {
  63.                 cout<<"recv fail!"<<endl;
  64.                 return -1;
  65.         }                               
  66.         recv_buff[MAX_SIZE-1] ='\0';
  67.         cout<<"recv msg :"<<recv_buff<<endl; // output recv msg
  68.        
  69.        
  70.         close(confd);

  71.         return 0;       
  72. }
复制代码
  1. /* server */

  2. #include<string.h>
  3. #include<iostream>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<stdlib.h>
  7. #include<netinet/in.h>
  8. #include<sys/time.h>
  9. #include<unistd.h>
  10. #include<arpa/inet.h>

  11. #define PORT 6000
  12. #define MAX_SIZE 1420
  13. #define back_log 1000  //max linking number       
  14. using namespace std;
  15. int main()
  16. {
  17.         int listenfd,confd; // sockfd
  18.         struct sockaddr_in s_add,c_add;
  19.         socklen_t sin_size;
  20.         timeval *server_time;
  21.         char send_buff[MAX_SIZE] = {0};
  22.         char recv_buff[MAX_SIZE] = {0};
  23.         strcpy(send_buff,"Welcome to mark's server!");       
  24.        
  25.         if ( (listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1 )// create socket
  26.         {
  27.                 cout<<"Socket fail!"<<endl;
  28.                 return -1;
  29.         }
  30.         cout << "Socket OK!"<<endl;       
  31.         bzero(&s_add,sizeof(sockaddr_in));
  32.         s_add.sin_family = AF_INET;// IPV4
  33.         s_add.sin_port = htons(PORT);   
  34.         s_add.sin_addr.s_addr = htonl(INADDR_ANY);//   
  35.         // s_add.sin_addr.s_addr = inet_addr("0.0.0.0");//   
  36.         if (-1 == bind( listenfd , (struct sockaddr*)(&s_add) , sizeof(struct sockaddr)))// bind
  37.         {
  38.                 cout<<"Bind port fail!"<<endl;
  39.                 return -1;       
  40.         }
  41.         cout<<"Bind port succeed!"<<endl;
  42.         if (-1 == listen( listenfd , back_log ) )// listen
  43.         {
  44.                 cout<<"Listen fail!"<<endl;
  45.                 return -1;
  46.         }
  47.         cout<<"Listen OK!"<<endl;
  48.         // cout<<"s_addr = "<<s_add.sin_addr.s_addr<<",port:"<<s_add.sin_port<<endl;       
  49.         while (true)
  50.         {
  51.                 sin_size = sizeof(struct sockaddr_in);
  52.                 if ( ( confd = accept( listenfd , (struct sockaddr*)(&c_add) ,&sin_size )) == -1 )
  53.                 {
  54.                         cout<<"Accept fail!"<<endl;
  55.                         return -1;
  56.                
  57.                         cout<<"Accepted!"<<endl;
  58.                         cout<<"connection from:"<<ntohl(c_add.sin_addr.s_addr)<<" port:"<<ntohs(c_add.sin_port)<<endl;
  59.                         gettimeofday(server_time,NULL);
  60.                         cout<<"Now time is:"<<server_time->tv_sec<<"s "<<server_time->tv_usec<<"us"<<endl;
  61.                         while (-1 != recv(confd,recv_buff,MAX_SIZE,0))
  62.                         {
  63.                                 send(confd,send_buff,MAX_SIZE,0);
  64.                                 recv_buff[MAX_SIZE-1] = '\0';
  65.                                 cout<<"recv msg:"<<recv_buff<<endl;
  66.                         }               

  67.                 }
  68.                 close(confd);
  69.         }



  70. }       
复制代码

论坛徽章:
0
发表于 2015-07-29 10:39 |显示全部楼层
在VMWARE虚拟下进行的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-07-29 13:11 |显示全部楼层
回复 1# y335061


    errno看一下,另外不会是权限的问题吧,sudo运行试试

论坛徽章:
0
发表于 2015-08-31 00:08 |显示全部楼层
client中调用socket的地方,= 优先级比 == 低,
写程序最好别在if中干赋值的事。

然后你的程序还有问题,自己耐心调试吧。

论坛徽章:
0
发表于 2015-09-01 09:33 |显示全部楼层
你得程序好几处错误,Accept出错返回,还有gettimeofday。。。回复 1# y335061


   

论坛徽章:
0
发表于 2015-09-13 12:21 |显示全部楼层
回复 1# y335061


   

论坛徽章:
0
发表于 2015-09-13 13:19 |显示全部楼层
clien端
57行:
if (-1 == connect( confd , (struct sockaddr *)(&s_add),sizeof(struct sockaddr)))// connect
第三个参数改成 sizeof(struct sockaddr_in)

server端:
38行:
if (-1 == bind( listenfd , (struct sockaddr*)(&s_add) , sizeof(struct sockaddr)))// bind
第三个参数改成 sizeof(struct sockaddr_in)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP