免费注册 查看新帖 |

Chinaunix

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

socket通信问题求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-02 10:53 |只看该作者 |倒序浏览
虚拟机linux服务端与windows下客户端连接不上, 虚拟机采用桥接模式

linux服务器
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #include<sys/wait.h>

  9. #define BACKLOG 5

  10. int main(int arge,char *argv[])
  11. {
  12.     int sockfd,new_fd;
  13.     struct sockaddr_in my_addr;
  14.     struct sockaddr_in their_addr;
  15.     int sin_size;
  16.     int data[2];
  17.     int sum ;
  18.     if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
  19.     {
  20.         perror("socket fail");
  21.         exit(1);
  22.     }
  23.    
  24.     my_addr.sin_family = AF_INET;
  25.     my_addr.sin_port = htons(12345);
  26.     my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  27.     bzero(&(my_addr.sin_zero),0);

  28.     if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)
  29.     {
  30.         perror("bind fail");
  31.         exit(1);
  32.     }
  33.     if(listen(sockfd,BACKLOG) ==-1)
  34.     {
  35.         perror("listen fail");
  36.         exit(1);
  37.     }

  38.     while(1)
  39.     {
  40.         sin_size  = sizeof(struct sockaddr_in);
  41.         printf("hello\n");
  42.         if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size)) == -1)
  43.         {
  44.             perror("accept fail");
  45.             continue;
  46.         }
  47.         printf("Server:got connection from %s\n",inet_ntoa(their_addr.sin_addr));
  48.         if(!fork())
  49.         {
  50.             while(1)
  51.             {
  52.                 if((recv(new_fd,data,sizeof(data),0)) == -1)
  53.                 {
  54.                     printf("recv fail");
  55.                     break;
  56.                 }
  57.                 sum = data[0] +data[1];
  58.                 send(new_fd,(const char*)(char*)&sum,sizeof(sum),0);

  59.             
  60.             }
  61.             close(new_fd);
  62.             exit(0);
  63.         }
  64.    
  65.    
  66.    
  67.     }
  68.     close(new_fd);
  69.     close(sockfd);

  70.     return 0;
  71. }
复制代码
windows客户端
  1. // Client.cpp : 定义控制台应用程序的入口点。
  2. //

  3. //#include "stdafx.h"
  4. #include <iostream>
  5. #include <winsock.h>
  6. #pragma comment(lib, "ws2_32.lib")

  7. using namespace std;

  8. int main(int argc, char* argv[])
  9. {
  10.         try
  11.         {
  12.                 //初始化套接字库
  13.                 //WSAStartup
  14.                 WORD wVersion = MAKEWORD(2, 2);
  15.                 WSADATA wsaData;
  16.                 if (0 != ::WSAStartup(wVersion, &wsaData))
  17.                 {
  18.                         throw "WSAStartup fail!";
  19.                 }
  20.                 if (2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))
  21.                 {
  22.                         throw "Verify version fail!";
  23.                 }

  24.                 //创建一个SOCKET
  25.                 //socket
  26.                 SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0);
  27.                 if (INVALID_SOCKET == sock)
  28.                 {
  29.                         throw "Create socket fail!";
  30.                 }

  31.                
  32.                 //SOCKADDR_IN
  33.                 SOCKADDR_IN serverAddr;
  34.                 serverAddr.sin_family = AF_INET;
  35.                 serverAddr.sin_port = htons(12345);
  36.                 serverAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.15");

  37.                 //连接服务器
  38.                 if (SOCKET_ERROR == ::connect(sock, (const sockaddr*)&serverAddr, sizeof(serverAddr)))
  39.                 {
  40.                         int iError = ::WSAGetLastError();
  41.                         cout << "connect fail!" << endl;
  42.                         //::Sleep(5000);
  43.                 }

  44.                 //Sleep(5000);
  45.                 //closesocket(sock);
  46.                 //return 0;
  47.                 while (1)
  48.                 {
  49.                         //发送数据
  50.                         int iSendData[2];
  51.                         cout << "Please input data:" << endl;
  52.                         cin >> iSendData[0] >> iSendData[1];
  53.                         ::send(sock, (const char*)&iSendData, sizeof(iSendData), 0);
  54.                         //::send(sock, "1111111", sizeof("1111111"), 0);
  55.                         //char szRecvBuf[100];
  56.                         //::recv(sock, (char*)szRecvBuf, sizeof(szRecvBuf), 0);
  57.                         //接收应答
  58.                         int iSum = 0;
  59.                         ::recv(sock, (char*)&iSum, sizeof(iSum), 0);
  60.                         cout << iSum <<endl;
  61.                 //        cout << szRecvBuf << endl;
  62.                 }

  63.        
  64.                 ::closesocket(sock);
  65.        
  66.                 ::WSACleanup();
  67.         }
  68.         catch (char* pStr)
  69.         {
  70.                 cout << pStr << endl;
  71.                 return -1;
  72.         }
  73.         return 0;
  74. }
复制代码
都能互相ping到但是一运行就连接不上,怎么解决?有木有大神

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-15 06:20:00
2 [报告]
发表于 2015-09-12 04:19 |只看该作者
服务器端程序    第29行代码   bzero(&(my_addr.sin_zero),0); ,把刚绑定的服务器ip、端口、协议信息清除掉了。你肯定是收不到信息的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP