2013-06-02 35 views
-4

我是Linux新手,我嘗試創建一個服務器。我打開了接受方法。客戶端嘗試連接,但沒有任何反應!我不知道爲什麼。想幫助我嗎?我的c服務器不接受爲什麼?

服務器端:

int main(int argc, char *argv[]) 
{ 
    int len,err,port; 
    if(argc != 2) { 
     exit(1); 
    } 
    initSem(); 
    port = atoi(argv[1]); 
    initSocket(port); 
    printf("server fd: %d.\n", serverFd); 

    len = sizeof(struct sockaddr_in); 
    printf("len: %d\n",len); 
    clientsFd[counterThread] = accept(serverFd, 
             (struct sockaddr*)&clientsAddress[counterThread], 
             (socklen_t*)&len); 
    printf("new client:: %d", clientsFd[counterThread]); 
    if(clientsFd[counterThread] == -1) { 
     perror("can't connect to new client."); 
     exit(1); 
    } 

    return 0; 
} 

void initSocket(int port) 
{ 
    erverFd = socket(AF_INET, SOCK_STREAM, 0); 

    serverAdrees rees.sin_addr.s_addr = INADDR_ANY; 
    serverAdrees.sin_port = htons(port); 
    bind(serverFd, (struct sockaddr*)&serverAdrees, (socklen_t)sizeof(struct sockaddr_in)); 

    listen(serverFd, MAX_CLIENTS); 
} 

客戶端:

int main(int argc, char *argv[]) 
{ 
    int err,len,port; 
    struct sockaddr_in serverAddr; 
    char massageBuf[MAX_MASSAGE]; 
    pthread_t readThread; 
    if(argc != 3) { 
     perror("no arguments..\n"); 
     return 1; 
    } 
    if((serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     perror("\n Error : Could not create socket \n"); 
     return 1; 
    } 
    printf("server fd: %d.\n", serverFd); 

    serverAddr.sin_family = AF_INET; 
    port = atoi(argv[2]); 
    serverAddr.sin_port = htons(port); 
    printf("addr: %s .\n", argv[1]); 
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    printf("before connect\n"); 
    if(connect(serverFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) 
    { 
     perror("\n Error : Connect Failed \n"); 
     return 1; 
    } 
    printf("after connect \n"); 
    while (1) { 
     scanf("%s", massageBuf); 
     printf("%s \n", massageBuf); 
     if(-1 == write(serverFd, massageBuf, strlen(massageBuf))) { 
      perror("\n Error : write to server Failed \n"); 
      return 1; 
     } 
     if(!strcmp(massageBuf,"close")) { 
      exit(1); 
      return 0; 
+6

您應該檢查每個與套接字相關的系統調用的結果(套接字,綁定,偵聽,接受,連接),然後您將知道哪一個失敗。 (很可能你的'bind'失敗了,因爲你沒有對'ServerAddress'結構進行清零操作,或者也許這個端口正忙)。如果你打算在Linux下繼續編程,那麼按照規則:總是檢查系統的結果或者可能會以某種方式失敗的庫函數(呃,我不鼓勵檢查'printf'的結果,但是大多數應該被檢查)。 – Inspired

+4

請縮進您的代碼以使其可讀。然後請將其降低到顯示問題的最簡單的**代碼。 –

回答

1

您的客戶端試圖連接到INADDR_ANY,這不能是正確的。將connect()調用到您作爲命令行參數提供的地址。

除此之外,很難說,因爲代碼不是很多SSCCE。正如評論所示,嘗試清理它。卸下像initSem();電話(或顯示他們的代碼)和結構,如clientsFd[counterThread]

編輯建議刪除關於accept(),是我不好。

+0

INADDR_ANY可以在同一臺機器上運行(嘗試telnet 0 22),他確實調用accept() – unbeli

+0

@unbeli編號'telnet 0 22'與'telnet 0.0.0.0 22'不一樣。試試兩個。 – EJP

+0

@unbeli是的,你是對的。在看代碼時我錯過了接受。那麼我會說它只是INADDR_ANY。 – thuovila

相關問題