2013-07-04 210 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