簡體   English   中英

UNIX中的套接字編程

[英]socket programming in c unix

我已經寫了一個基於服務器/客戶端的c程序。 該程序的基本功能是客戶端將向服務器發送一個字符,例如,服務器將其遞增並將字符發回。 因此,如果客戶發送“ a”,它將收到“ b”。 但是,當客戶端發送“ q”時,服務器應該關閉連接。 該程序正在執行其應做的工作,但是在客戶端將其打印兩次“輸入字符”和“來自服務器的字符”。 同時發送“ q”並會關閉連接,但前提是您第二次發送該連接。

這是服務器端代碼

void *client_thread(void *client_sockfd){
    int socket=*(int *)client_sockfd;
    while(1){
        read(socket, &ch, 1);
        if(ch=='q')
        {
            close(socket); 
        }
        else 
        {
            ch++;
            write(socket, &ch, 1);
        }
    }
    //close(socket);
    printf("Connection closed with %d",socket);       

}//end fucntion

客戶端代碼

while(1)
{
    printf("Enter a character");
    scanf("%c",&ch);  
    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    printf("char from server = %c\n", ch);

    //  close(sockfd);
    //exit(0);
}
if(ch=='q'){
    printf("Server closed the connection");
}

scanf一次讀取一個字符,因此,當您鍵入一個字符並按Enter鍵時,第一個循環將讀取該字符,第二個循環將讀取換行符。

您可以使用

scanf("%c%*c", &ch);

讀取兩個字符,但僅存儲第一個字符。

printf("Enter a character");
scanf("%c",&ch); 

實際上,您在此處輸入了兩個字符,每個按下的鍵一個,第二個字符來自Enter ,這是換行符/n 這就是為什么其他所有輸出

printf("char from server = %c\n", ch);

可能是:

char from server =

然后有一個空行 ,然后是另一個輸出。 如果您改為這樣做:

printf("char from server = %d\n", (int)ch);
                       //   ^ not %c

在這里強制轉換為int並不是真正必要的,但是強調了這個想法。 您現在將獲得字符的十進制ASCII值,並且每隔一行將是:

char from server = 10

那是換行符。 有關解決此問題的方法,該方法已使您比以前捕獲了無數新生真菌, 請在此處查看我的答案

您的程序正在執行以下操作...

  1. 打印消息“輸入字符”並阻止等待STDIN
  2. 用戶類型'a'和'\\ n'-scanf()直到換行符才返回控制
  3. 寫“ a”,讀“ b”,打印“ b”,然后提示“輸入字符”
  4. Scanf已經有一個字符(\\ n),因此它立即返回
  5. 寫'\\ n',讀'\\ n'+ 1,打印'\\ n'+ 1並提示“輸入字符”
  6. 從1開始重復。

這就是為什么您兩次看到“輸入字符”的原因。

至於必須發送兩次“ q”,則服務器循環在收到“ q”時不會退出,而是調用close並繼續讀取。 此后的每次讀取都會失敗,並立即返回錯誤代碼。 同樣,您的客戶端循環也不會中斷。

捕獲並測試您的返回值。 同樣,逐步調試器-這將回答您有關C的許多問題,而不必等待論壇作出響應。

客戶端:在此打印兩行,因為有兩個輸入,一個是您的字符,第二個是enter\\n

因此,使用scanf("%c%c",&ch); 在客戶端。

服務器端:第二次使用while((n = read(sockfd, &ch, 1))>0)阻止它自動終止連接。 read語句返回讀取的字節數。

因為您提供的值在獲得增量后不會被擦除。 原因是:

  • 假設您的輸入是a ,那么服務器將對您響應b ,並且由於您沒有在服務器端檢查readreturn值,因此它每次都會增加ch並且在到達q會關閉套接字。
  • 當服務器遞增該值時,它還會將其發送給客戶端,但是由於客戶端處於scanf模式,因此在read語句之前無法獲取輸入,因此,您看不到自動遞增值。 而且增量是如此之快,以至於在您下次輸入之前,插座已經被終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM