2016-04-14 230 views
0

我有這段代碼,我在同一臺PC上運行虛擬機的客戶端,它可以連接但它永遠不會收到LOGIN消息,可能是什麼原因?tcp套接字服務器不發送

不確定發送flags參數設置是否正確。

static const char *LOGIN = "LOGIN\n"; 

int main() 
{ 
    int s = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in addr; 
    socklen_t addrlen = sizeof(addr); 

    //initialize structure 
    bzero(&addr, addrlen); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(6666); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 

    bind(s, (struct sockaddr *)&addr, addrlen); 
    listen(s, 1); 

    struct sockaddr_in client_addr; 
    socklen_t client_addrlen = sizeof(client_addr); 
    int c = accept(s, (struct sockaddr *)&client_addr, &client_addrlen); 

    char *msg = new char[15]; 

     //print client address 
     char * buf = new char[16]; 
     inet_ntop(AF_INET, &(client_addr.sin_addr.s_addr), buf, 16); 
     cout << "Client connected: " << buf << endl; 
     cout << "---------------------" << endl; 

     send(c, LOGIN, sizeof(LOGIN), 0); 

    close(c); 
    close(s); 
    return 0; 
} 
+0

一個好的開始是檢查錯誤。所有這些系統調用都會返回一個失敗(它們返回值「-1」),在這種情況下,您應該檢查['errno'](http://man7.org/linux/man-pages/man3/errno。 3.html)看看出了什麼問題。您可以使用例如['perror'](http://man7.org/linux/man-pages/man3/perror.3.html)打印出一條信息,或者使用['strerror'](http://man7.org/ linux/man-pages/man3/strerror.3.html)從錯誤代碼中獲取可打印的字符串。 –

回答

3

你必須改變:

static const char *LOGIN = "LOGIN\n"; 

到:

static const char LOGIN[] = "LOGIN\n"; 

和發送呼叫:

send(c, LOGIN, sizeof(LOGIN)-1, 0); 

原始呼叫通過4(如果在32位系統),因爲sizeof是應用程序ied指針而不是字符串。固定版本中的-1從字符串中減去終止'0'

+2

或者只是使用'strlen'來代替。 –

相關問題