2012-03-23 52 views
0
#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <string.h> 
#include <cstdio> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int port, n,sockfd; 
    struct sockaddr_in srv_addr; 
    struct hostent *serv; 

    char buffer[256]; 

    if(argc<3) 
    { 
    cout <<"\n ussage: host port\nexiting\n"; 
    return 0; 
    } 

    port=atoi(argv[2]); 

    sockfd=socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
    { 
    cout <<"\nsocket creation on"<<port<<" failed\nexiting\ncheck to see if port is in use"; 
    return 0; 
    } 

    serv = gethostbyname(argv[1]); 

    if (serv=NULL) 
    { 
    cout <<"\n"<<serv<<" is not a valid host name\nexiting"; 
    return 0; 
    } 

    bzero((char *) &srv_addr, sizeof(srv_addr)); 

    srv_addr.sin_family=AF_INET; 

    bcopy((char *) serv->h_addr, 
     (char *) &srv_addr.sin_addr.s_addr, 
       serv->h_length); 

    srv_addr.sin_port=htons(port); 
    if (connect(sockfd,&srv_addr, 
       sizeof (srv_addr))<0) 
    { 
    cout <<" \nconnection failed\n"; 
    } 

    cout <<"\nType message\n"; 

    bzero(buffer, 256); 

    cin.getline(buffer,256); 

    n=write(sockfd,buffer,strlen(buffer)); 
    if (n>0) 
    { 
    cout <<"\nsocket write error\nexiting\n"; 
    } 

    n=read(sockfd,buffer,255); 


    if (n>0) 
    { 
    cout <<"\nsocket read error\nexiting\n"; 
    }   

    cout <<buffer; 

    return 0; 
} 

在編譯時,我得到這個錯誤:C++ INET noob,我做錯了什麼?

fg.c: In function ‘int main(int, char**)’: 
fg.c:53:33: error: cannot convert ‘sockaddr_in*’ to ‘const sockaddr*’ for argument ‘2’ to ‘int connect(int, const sockaddr*, socklen_t)’ 

我不能弄明白。我是編程的一個小菜鳥。任何幫助都很感激。

+2

你能正確取悅格式/縮進你的代碼?這將使你更容易遵循你所寫的內容。 – Bart 2012-03-23 16:56:53

+0

我以爲我做到了。多數民衆贊成在多大程度上......或者說我是這樣。在我十幾歲的時候用它來編寫簡單的小C++代碼。 – TaroKhan 2012-03-23 17:55:17

+0

謝謝Arrowdodger。我意識到這是指我的結構,因爲我問你第二個問題。 – TaroKhan 2012-03-23 17:56:58

回答

1

您需要顯式投射。更換

connect(sockfd,&srv_addr, sizeof (srv_addr)) 

connect(sockfd,(sockaddr*)&srv_addr, sizeof (srv_addr)) 
+0

是否需要聲明sockaddr,或者這是我已經以不同的名稱聲明的東西。 – TaroKhan 2012-03-23 17:50:38

+1

您繼續將'srv_addr'變量聲明爲'sockaddr_in',但您在調用connect()時將其類型轉換爲'sockaddr',就像arrowdodger顯示的那樣。 'sockaddr'在與'sockaddr_in'相同的頭文件中聲明。 – 2012-03-24 00:39:41