嗨皮k 发表于 2015-08-02 10:53

socket通信问题求解

虚拟机linux服务端与windows下客户端连接不上, 虚拟机采用桥接模式

linux服务器#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/wait.h>

#define BACKLOG 5

int main(int arge,char *argv[])
{
    int sockfd,new_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    int sin_size;
    int data;
    int sum ;
    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
      perror("socket fail");
      exit(1);
    }
   
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(12345);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    bzero(&(my_addr.sin_zero),0);

    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)
    {
      perror("bind fail");
      exit(1);
    }
    if(listen(sockfd,BACKLOG) ==-1)
    {
      perror("listen fail");
      exit(1);
    }

    while(1)
    {
      sin_size= sizeof(struct sockaddr_in);
      printf("hello\n");
      if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size)) == -1)
      {
            perror("accept fail");
            continue;
      }
      printf("Server:got connection from %s\n",inet_ntoa(their_addr.sin_addr));
      if(!fork())
      {
            while(1)
            {
                if((recv(new_fd,data,sizeof(data),0)) == -1)
                {
                  printf("recv fail");
                  break;
                }
                sum = data +data;
                send(new_fd,(const char*)(char*)&sum,sizeof(sum),0);

            
            }
            close(new_fd);
            exit(0);
      }
   
   
   
    }
    close(new_fd);
    close(sockfd);

    return 0;
}
windows客户端// Client.cpp : 定义控制台应用程序的入口点。
//

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

using namespace std;

int main(int argc, char* argv[])
{
        try
        {
                //初始化套接字库
                //WSAStartup
                WORD wVersion = MAKEWORD(2, 2);
                WSADATA wsaData;
                if (0 != ::WSAStartup(wVersion, &wsaData))
                {
                        throw "WSAStartup fail!";
                }
                if (2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))
                {
                        throw "Verify version fail!";
                }

                //创建一个SOCKET
                //socket
                SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0);
                if (INVALID_SOCKET == sock)
                {
                        throw "Create socket fail!";
                }

               
                //SOCKADDR_IN
                SOCKADDR_IN serverAddr;
                serverAddr.sin_family = AF_INET;
                serverAddr.sin_port = htons(12345);
                serverAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.15");

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

                //Sleep(5000);
                //closesocket(sock);
                //return 0;
                while (1)
                {
                        //发送数据
                        int iSendData;
                        cout << "Please input data:" << endl;
                        cin >> iSendData >> iSendData;
                        ::send(sock, (const char*)&iSendData, sizeof(iSendData), 0);
                        //::send(sock, "1111111", sizeof("1111111"), 0);
                        //char szRecvBuf;
                        //::recv(sock, (char*)szRecvBuf, sizeof(szRecvBuf), 0);
                        //接收应答
                        int iSum = 0;
                        ::recv(sock, (char*)&iSum, sizeof(iSum), 0);
                        cout << iSum <<endl;
                //        cout << szRecvBuf << endl;
                }

       
                ::closesocket(sock);
       
                ::WSACleanup();
        }
        catch (char* pStr)
        {
                cout << pStr << endl;
                return -1;
        }
        return 0;
}
都能互相ping到但是一运行就连接不上,怎么解决?有木有大神

yangchao1117 发表于 2015-09-12 04:19

服务器端程序    第29行代码   bzero(&(my_addr.sin_zero),0); ,把刚绑定的服务器ip、端口、协议信息清除掉了。你肯定是收不到信息的。
页: [1]
查看完整版本: socket通信问题求解