2013-01-08 112 views
0

我使用以下代碼來連接到其上提供作爲命令行參數某個端口的服務器...連接:連接在C程序拒絕在客戶端

#include <stdio.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <strings.h> 

int main(int argc,char *argv[]) 
{ 
    struct sockaddr_in serverAddr; 
    int clientSocketFd ; 
    char buffer[1024]; 

if((clientSocketFd = socket(AF_INET, SOCK_STREAM, 0))==-1) 
    perror("socket"); 

//get the server IP address and PORT 
bzero(&serverAddr, sizeof serverAddr); 
printf("ip address :- %s\n",argv[1]); 
inet_pton(AF_INET, argv[1], &(serverAddr.sin_addr)); 
serverAddr.sin_family=AF_INET; 
serverAddr.sin_port = atoi(argv[2]); 

printf("PORT :- %d\n",serverAddr.sin_port); 
//connect to server 
if(connect(clientSocketFd,(struct sockaddr *) &serverAddr, sizeof(serverAddr)) == -1) 
    perror("connect"); 

printf("Connecting to the server %s on port %s \n",argv[1],argv[2]); 

while (1) 
{ 
    //receive incoming data 
    if(recv(clientSocketFd, buffer,1023, 0)==-1) 
    { 
    printf("buffer : %s\n" ,buffer); 
    printf("Received from Server : %s \n",buffer); 
     break; 
    } 


} 
close(clientSocketFd); 

}

但在客戶端,它顯示「連接:連接被拒絕」 ......

如果我使用telnet,那麼就說明連接,但無法通過client.c 上述代碼連接plz幫助

另外我更改了最大允許掛起連接數爲100,然後也沒有解決問題...... :(...幫助plz

回答

9

您正在連接到錯誤的端口。更改:

serverAddr.sin_port = atoi(argv[2]); 

要:這些結構的

serverAddr.sin_port = htons(atoi(argv[2])); 

想象的那樣被使用,另外一個星球,他們寫不同他們的數字通信。你必須轉換成你寫數字的方式和寫數字的方式,否則你會變得無稽之談。

htons函數將端口號從計算機存儲它們的方式轉換爲在網絡上使用它們的方式。 ntohs函數將端口號從網絡中使用的端口號轉換爲您的計算機存儲它們的方式。套接字地址採用網絡字節順序。

+2

小澄清:這是必要的,因爲端口在地址結構中以[大(又名網絡)字節順序](http://en.wikipedia.org/wiki/Endianness)存儲。 – unwind

+0

好的先生..我會盡力.. – Subbu

+0

謝謝你先生......問題解決了! – Subbu