2015-05-30 293 views
1

我是新來的套接字編程,我試圖使用gcc編譯器在Linux中的服務器 - 客戶端連接。服務器和客戶端,這兩個代碼都在不同的C文件中。我通過用戶輸入向服務器發送字符,服務器遞增字符並將其返回給客戶端。客戶端應該保持連接狀態,直到我從字符'Q'用戶。我在維護連接時遇到問題。在這裏,我正在粘貼客戶端代碼。當我不使用while循環並只發送一個字符時,它可以正常工作,但是如果我一再想要通過同一連接發送字符,並且連接只會在用戶輸入Q時關閉。那麼,在循環的第一次迭代它要求字符,併成功地從服務器獲取增加的字符,但第二次它說「傳輸端點已連接」。請幫助我理解這一點。瞭解客戶端 - 服務器連接

int main(int argc, char *argv[]) 
{ 
    int sockfd; 
    int len, port; 
    struct sockaddr_in address; 
    int result; 
    char ch; 
    port = atoi(argv[1]); 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    address.sin_port = port; 
    len = sizeof(address); 


    while (1){ 

     printf("Enter Character To Send The Server OR Q/q To End The Connection:"); 
     scanf("%c", &ch); 
     fflush(stdin); 

     if (connect(sockfd, (struct sockaddr *)&address, len) == -1) { 
      perror("oops: client failed to connect"); 
      return 1; 
     } 
     if (ch == 'Q' || ch == 'q'){ 
      printf("Connection Closed"); 
      break; 
     } 

     write(sockfd, &ch, 1); 
     read(sockfd, &ch, 1); 
     printf("Incremented character from server = %c\n", ch); 

    } close(sockfd); 
    return 0; 
} 
+0

的消息說,這一切:你想'connect'一個已經連接的套接字(在你的第二個和後面的迭代)。在TCP中,一旦建立連接,它將保持打開狀態,直到您手動關閉連接。只需將'connect'呼叫移出'while'循環。 – szczurcio

+0

@szczurcio是的我試圖通過在循環之前的連接,在這種情況下,這裏是輸出。異常終止。 輸入字符發送服務器或Q/q要結束連接:從服務器A 遞增計數字符= B 輸入字符發送服務器或Q/Q結束的 連接:從服務器遞增計數字符= 輸入字符發送服務器或Q/q結束連接:K 「程序終止 –

回答

0

如果沒有發佈後續編輯,很難準確地判斷出錯的位置。

由於括號的放置(作爲while循環塊定義的一部分),您是否意外地關閉了文件描述符?

你應該只需要撥打connect()一次就可以了。 以下代碼適用於我(我的服務器代碼只是將客戶端收到的字符寫回給它,並且客戶端按預期接收/打印它)。

我不得不添加:

address.sin_port = htons(port); 

然後移動連接()函數調用了while循環確保從環破即接收時的接近函數調用僅由qQ

int main(int argc, char *argv[]) 
{ 

    int sockfd; 
    int len, port; 
    struct sockaddr_in address; 
    int result; 
    char ch; 
    port = atoi(argv[1]); 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    address.sin_port = htons(port); 
    len = sizeof(address); 

    if (connect(sockfd, (struct sockaddr *)&address, len) == -1) { 
      perror("oops: client failed to connect"); 
      return 1; 
     } 

    while(1) 
    { 
     printf("Enter Character To Send The Server OR Q/q To End The Connection:"); 
     scanf("%c", &ch); 
     fflush(stdin); 

     if (ch == 'Q' || ch == 'q'){ 
      printf("Connection Closed"); 
      break; 
     } 

     write(sockfd, &ch, 1); 
     read(sockfd, &ch, 1); 
     printf("Incremented character from server = %c\n", ch); 
    } 

    close(sockfd); 
    return 0; 
} 

如果你仍然有問題,那麼你的服務器代碼中可能會發生一些奇怪的事情。你意外斷開客戶端連接?

一些偉大的,容易理解的例子在這裏:

http://www.thegeekstuff.com/2011/12/c-socket-programming