• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Linux網絡編程基礎(三)

    發表于:2007-05-25來源:作者:點擊數: 標簽:linux網絡編程讀寫完整基礎
    完整的讀寫函數 一旦我們建立了連接,我們的下一步就是進行通信了.在 Linux 下面把我們前面建立的通道 看成是文件描述符,這樣 服務器 端和客戶端進行通信時候,只要往文件描述符里面讀寫東西了. 就象我們往文件讀寫一樣. 1、寫函數write ssize_t write(int fd,

    完整的讀寫函數

        一旦我們建立了連接,我們的下一步就是進行通信了.在Linux下面把我們前面建立的通道 看成是文件描述符,這樣服務器端和客戶端進行通信時候,只要往文件描述符里面讀寫東西了. 就象我們往文件讀寫一樣.


    1、寫函數write

        ssize_t write(int fd,const void *buf,size_t nbytes)

        write函數將buf中的nbytes字節內容寫入文件描述符fd.成功時返回寫的字節數.失敗時返回-1. 并設置errno變量. 在網絡程序中,當我們向套接字文件描述符寫時有倆種可能.

        (1)write的返回值大于0,表示寫了部分或者是全部的數據.

        (2)返回的值小于0,此時出現了錯誤.我們要根據錯誤類型來處理.

        如果錯誤為EINTR表示在寫的時候出現了中斷錯誤.

        如果為EPIPE表示網絡連接出現了問題(對方已經關閉了連接).

        為了處理以上的情況,我們自己編寫一個寫函數來處理這幾種情況.


        int my_write(int fd,void *buffer,int length)
        {
                int bytes_left;
                int written_bytes;
                char *ptr;

                ptr=buffer;
                bytes_left=length;
                while(bytes_left>0)  { 
                         /* 開始寫*/
                        written_bytes=write(fd,ptr,bytes_left);
                        if(written_bytes<=0) /* 出錯了*/ {
                                if(errno==EINTR) /* 中斷錯誤 我們繼續寫*/
                                        written_bytes=0;
                                else /* 其他錯誤 沒有辦法,只好撤退了*/
                                        return(-1);
                                } 
                        bytes_left-=written_bytes; 
                        ptr+=written_bytes; /* 從剩下的地方繼續寫 */
                }
                return(0);
        } 

    2、讀函數read
        ssize_t read(int fd,void *buf,size_t nbyte)

        read函數是負責從fd中讀取內容.當讀成功時,read返回實際所讀的字節數,如果返回的值是0 表示已經讀到文件的結束了,小于0表示出現了錯誤.如果錯誤為EINTR說明讀是由中斷引起的, 如果是ECONNREST表示網絡連接出了問題. 和上面一樣,我們也寫一個自己的讀函數.

        int my_read(int fd,void *buffer,int length)
        {
                int bytes_left;
                int bytes_read;
                char *ptr; 

                bytes_left=length;
                while(bytes_left>0) {
                         bytes_read=read(fd,ptr,bytes_read);
                         if(bytes_read<0) {
                                 if(errno==EINTR)
                                         bytes_read=0;
                                 else
                                         return(-1);
                        }
                        else if(bytes_read==0)
                                 break;
                       bytes_left-=bytes_read; 
                       ptr+=bytes_read;
                } 
                return(length-bytes_left);
        } 

    3、數據的傳遞
        有了上面的兩個函數,我們就可以向客戶端或者是服務端傳遞數據了.比如我們要傳遞一個結構.可以使用如下方式

        /* 客戶端向服務端寫 */

        struct my_struct my_struct_client; 
        write(fd,(void *)&my_struct_client,sizeof(struct my_struct);

        /* 服務端的讀*/
        char buffer[sizeof(struct my_struct)];
        struct *my_struct_server;
        read(fd,(void *)buffer,sizeof(struct my_struct)); 
        my_struct_server=(struct my_struct *)buffer;

        在網絡上傳遞數據時我們一般都是把數據轉化為char類型的數據傳遞.接收的時候也是一樣的 注意的是我們沒有必要在網絡上傳遞指針(因為傳遞指針是沒有任何意義的,我們必須傳遞指針所指向的內容)

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>