2013-07-04 187 views
0

我有这个代码的问题,如果我在客户端和服务器本地IP使用它的工作原理,但如果我使用客户端109.95.202.122 IP和服务器INADDR_ANY它不 我试图在两台计算机上但这还不行,请帮助我。WinSock客户端连接

客户

#include <iostream> 
#include <winsock2.h> 
#pragma comment(lib,"ws2_32.lib") 

int main(void) 
{ 
    WSADATA WsaDat; 
    if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0) 
    { 
     std::cout<<"Winsock error - Winsock initialization failed\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    // Create our socket 

    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(Socket==INVALID_SOCKET) 
    { 
     std::cout<<"Winsock error - Socket creation Failed!\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    // Resolve IP address for hostname 
    struct hostent *host; 
    if((host=gethostbyname("109.95.202.122"))==NULL) 
    { 
     std::cout<<"Failed to resolve hostname.\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    // Setup our socket address structure 
    SOCKADDR_IN SockAddr; 
    SockAddr.sin_port=htons(8888); 
    SockAddr.sin_family=AF_INET; 
    SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr); 

    // Attempt to connect to server 
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0) 
    { 
     std::cout<<"Failed to establish connection with server\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    // If iMode!=0, non-blocking mode is enabled. 
    u_long iMode=1; 
    ioctlsocket(Socket,FIONBIO,&iMode); 

    // Main loop 
    for(;;) 
    { 
     // Display message from server 
     char buffer[1000]; 
     memset(buffer,0,999); 
     int inDataLength=recv(Socket,buffer,1000,0); 
     std::cout<<buffer; 

     int nError=WSAGetLastError(); 
     if(nError!=WSAEWOULDBLOCK&&nError!=0) 
     { 
      std::cout<<"Winsock error code: "<<nError<<"\r\n"; 
      std::cout<<"Server disconnected!\r\n"; 
      // Shutdown our socket 
      shutdown(Socket,SD_SEND); 

      // Close our socket entirely 
      closesocket(Socket); 

      break; 
     } 
     Sleep(1000); 
    } 

    WSACleanup(); 
    system("PAUSE"); 
    return 0; 
} 

服务器

#include <iostream> 
#include <winsock2.h> 
#pragma comment(lib,"ws2_32.lib") 

int main() 
{ 
    WSADATA WsaDat; 
    if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0) 
    { 
     std::cout<<"WSA Initialization failed!\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(Socket==INVALID_SOCKET) 
    { 
     std::cout<<"Socket creation failed.\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    SOCKADDR_IN serverInf; 
    serverInf.sin_family=AF_INET; 
    serverInf.sin_addr.s_addr=INADDR_ANY; 
    serverInf.sin_port=htons(8888); 

    if(bind(Socket,(SOCKADDR*)(&serverInf),sizeof(serverInf))==SOCKET_ERROR) 
    { 
     std::cout<<"Unable to bind socket!\r\n"; 
     WSACleanup(); 
     system("PAUSE"); 
     return 0; 
    } 

    listen(Socket,1); 

    SOCKET TempSock=SOCKET_ERROR; 
    while(TempSock==SOCKET_ERROR) 
    { 
     std::cout<<"Waiting for incoming connections...\r\n"; 
     TempSock=accept(Socket,NULL,NULL); 
    } 

    // If iMode!=0, non-blocking mode is enabled. 
    u_long iMode=1; 
    ioctlsocket(Socket,FIONBIO,&iMode); 

    Socket=TempSock; 
    std::cout<<"Client connected!\r\n\r\n"; 

    // Main loop 
    for(;;) 
    { 
     char *szMessage="Welcome to the server!\r\n"; 
     send(Socket,szMessage,strlen(szMessage),0); 

     int nError=WSAGetLastError(); 
     if(nError!=WSAEWOULDBLOCK&&nError!=0) 
     { 
      std::cout<<"Winsock error code: "<<nError<<"\r\n"; 
      std::cout<<"Client disconnected!\r\n"; 

      // Shutdown our socket 
      shutdown(Socket,SD_SEND); 

      // Close our socket entirely 
      closesocket(Socket); 

      break; 
     } 

     Sleep(1000); 
    } 

    WSACleanup(); 
    system("PAUSE"); 
    return 0; 
} 
+0

会发生什么?你有错误吗?什么错误? – Stobor

+0

定义“不起作用”。 – EJP

+0

我的控制台上只有黑屏 –

回答

0

只是猜测,但我觉得你的问题是gethostbyname从内存不与IP地址的工作。也许看看getaddrinfo