• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            socket編程

            socket類型(在sys/socket.h中)

            int?SOCK_STREAM
            先連接到一臺主機然后用流方式傳送數據

            int?SOCK_DGRAM
            不連接,在數據包中包含目標地址,然后直接送出,包在傳送過程中可能丟失和錯位

            int?SOCK_RAW
            socket數據的底層傳輸,對于一般程序沒有什么意義


            地址的表示方法

            相關庫:sys/socket.h
            相關數據結構:struct?sockaddr?*
            sockaddr中的兩個元素:
            ===short?int?sa_family:指出地址的格式
            ===char?sa_data[14]:地址值



            地址的格式:
            AF_LOCAL:本地名稱空間(name?space)的地址
            AF_UNIX:和AF_LOCAL相同,但AF_UNIX是UNIX98標準
            AF_FILE:AF_LOCAL的另一個同義詞
            AF_INET:互聯網名稱空間,對應的名稱空間名為PF_INET
            AF_INET6:IPv6互聯網名稱空間
            AF_UNSPEC:用到的地方很少,比如清除"帶連接"的DATAGRAM的目標地址等,對應的名稱空間在新版本的libc中已經被去處



            設置socket地址(在sys/socket.h中)

            使用bind函數將某個地址分配給某個socket
            int?bind(int?socket,struct?sock_addr?*addr,socklen_t?length);
            將length長度的地址sock_addr分配給socket
            返回0代表成功,返回-1代表失敗



            讀取socket分配到的地址(在sys/socket.h中)

            使用getsockname函數來得到一個socket對應的地址
            int?getsockname(int?socket,struct?sockaddr?*addr,socklen_t?*length-ptr);
            將socket中的信息放置到*addr和*length-ptr所指定的空間中
            返回值0表示成功-1表示失敗



            網絡界面Interface的相關變量和函數

            以下內容在庫文件net/if.h中

            size_t?IFNAMSIZ
            表示出容納界面名稱的緩沖區的大小,包括結束符0

            unsigned?int?nametoindex(const?char?*ifname);
            返回ifname所指出的網絡界面的序號,返回0表示此界面不存在

            char?*if_indextoname(unsigned?int?ifindex,char?*ifname);
            找到一個網絡界面序號對應的界面名稱,返回值在ifname對應的那段內存空間上,這段空間至少有IFNAMSIZ大,返回ifname表示成功,返回NULL表示失敗

            struct?if_nameindex
            這個變量用于存儲單個網絡界面的信息,其中具有兩個元素:
            unsigned?int?if_index:界面序號
            char?*if_name:用null結尾的界面名稱

            struct?if_nameindex?*if_nameindex(void);
            返回一個struct?if_nameindex列表,其中存儲了所有界面的信息,最后一個if_nameindex的if_index序號為零,if_name為null
            此函數得到的結果必需用if_freenameindex函數清除

            void?if_freenameindex(struct?if_nameindex?*ptr);
            清除if_nameindex得到的結果



            本地名稱空間(local?namespace)

            本地名稱空間表示為PF_LOCAL(POSIX),PF_UNIX,PF_FILE

            本地名稱是一個文件名,只能本地調用不能從其他主機上連接

            本地socket結構(在sys/socket.h中)
            struct?sockaddr_un
            其中包含的元素為
            short?int?sun_family:地址的格式應當設為AF_LOCAL
            char?sun_path[108]:所要使用的文件的文件名(暫時定為108位,可能新的版本中會有所改變)

            sun_len函數:
            int?SUN_LEN(struct?sun?family?*);
            具體說應當是SUN_LEN宏,用來統計某個sockaddr_un結構的元素長度和文件名長度(不是分配的字節空間的長度)



            一個創建本地socket的例子
            #include?<stddef.h>
            #include?<stdio.h>
            #include?<errno.h>
            #include?<stdlib.h>
            #include?<sys/socket.h>
            #include?<sys/un.h>
            int?make_named_socket?(const?char?*filename)//此函數作用是用filename創建socket
            {
            ??struct?sockaddr_un?name;//socket地址名name
            ??int?sock;???????????????//socket
            ??size_t?size;

            ??/*?Create?the?socket.?*/
            ??sock?=?socket?(PF_LOCAL,?SOCK_DGRAM,?0);//PF_LOCAL表示本地socket
            ??????????????????????????????????????????//SOCK_DGRAM表示數據報方式
            ??if?(sock?<?0)//如創建失敗則報錯
            ????{
            ??????perror?("socket";
            ??????exit?(EXIT_FAILURE);
            ????}

            ??/*?Bind?a?name?to?the?socket.?*/
            ??name.sun_family?=?AF_LOCAL;
            ??strncpy?(name.sun_path,?filename,?sizeof?(name.sun_path));

            ??/*?地址的長度為sockaddr
            ?????結構中filename開始端的偏移量
            ?????加上filename中文件名的長度
            ?????加上一個字節(此字節為結束標識)
            ?????或者還可以用宏SUN_LEN:
            ?????size?=?SUN_LEN?(&name);
            ?*/
            ??size?=?(offsetof?(struct?sockaddr_un,?sun_path)
            ??????????+?strlen?(name.sun_path)?+?1);//開始計算

            ??if?(bind?(sock,?(struct?sockaddr?*)?&name,?size)?<?0)
            ????{
            ??????perror?("bind";
            ??????exit?(EXIT_FAILURE);
            ????}

            ??return?sock;
            }



            關于生成主機地址的函數

            inet_aton(const?char?*name,struct?in_addr?*addr);
            將以字符串表示的地址轉換成主機地址并儲存在struct?in_addr中

            uint32_t?inet_addr(const?char?*name);
            將字符串IPv4地址轉換成主機地址并返回,如失敗則返回INADDR_NONE(255.255.255.255);

            uint32_t?inet_network(const?char?*name);
            將停用

            char?*inet_ntoa(struct?in_addr?addr);
            將IPv4主機地址轉換成字符串
            注意:此函數的返回的字符串存儲在一段static類型的內存空間中,下次調用會覆蓋原先的結果,在多線程程序的運行中會出現混亂,所以推薦使用下文中介紹的inet_ntop

            struct?in_addr?inet_makeaddr(uint32_t?net,uint32_t?local);
            將網絡號net和主機名local組合成IPv4主機地址并返回

            uint32_t?inet_lnaof(struct?in_addr?addr);
            從IPv4網絡地址中取出主機名并返回(將停用)

            uint32_t?inet_netof(struct?in_addr?addr);
            從IPv4網絡地址中取出網絡號并返回(將停用)

            int?inet_pton(int?af,const?char?*cp,void?*buf);
            將IPv4或IPv6字符串地址轉換成網絡主機地址
            af:網絡地址的格式,可取值為AF_INET和AF_INET6
            cp:指向字符串首地址的指針
            buf:指向結果存儲空間的指針(應當預先分配好足夠的內存空間存儲結果)

            const?char?*inet_ntop(int?af,const?void?*cp,char?*buf,size_t?len);
            將IPv4或IPv6網絡主機地址轉換成字符串
            af:網絡地址的格式,可取數為AF_INET和AF_INET6
            cp:指向需要轉換的網絡地址
            buf:指向存儲轉換結果的內存空間
            len:buf所指向的空間的長度
            返回值為buf



            主機名數據庫查詢的相關變量

            struct?hostent
            其中元素:
            char?*h_name:主機的"官方"名稱
            char?**h_aliases:此主機的所有別名
            int?h_addrtype:地址類型,可以為AF_INET(IPv4類)和AF_INET6(IPv6類),也可以出現別的值
            int?h_length:地址的大小(用字節數計算)
            char?**h_addr_list:此主機名對應的所有IP,以一個null指針結束
            char?*h_addr:等于h_addr_list[0]



            主機名和數據庫查詢相關函數

            struct?hostent?*gethostbyname(const?char?*name);
            返回主機名name的信息,如果查詢失敗則返回一個null指針

            struct?hostent?*gethostbyname2(const?char?*name,int?af);
            和gethostbyname相通,不過可以在af中指出地址格式,可取AF_INET或AF_INET6,分別代表IPv4和IPv6

            struct?hostent?*gethostbyaddr(const?char?*addr,size_t?length,int?format);
            返回指定網絡主機的信息,addr并非指向字符串而是指向一個網絡地址,length為addr中地址的長度,format為地址的格式(可取AF_INET或AF_INET6)



            創建socket

            所需函數
            int?socket(int?namespace,int?style,int?protocol);
            namespace:socket類型(比如PF_LOCAL和PF_INET)
            style:傳輸方式(可取SOCK_STREAM和SOCK_DGRAM)
            protocol:協議,一般取0



            關閉socket

            所需函數
            int?shutdown(int?socket,int?how);
            關閉socket
            返回0成功,返回-1失敗
            how可取值為
            0:停止接收數據
            1:停止送出數據
            2:停止接收和讀取



            socket對(socket?pair)

            兩個可以互相傳送的本地socket,和pipe類似,不過pipe為單向,socket對為雙向

            創造socket對所需函數
            int?socketpair(int?namespace,int?style,int?protocol,int?filedes[2]);
            namespace:必需為AF_LOCAL
            style:可以取SOCK_STREAM或者SOCK_DGRAM
            filedes[2]:創建的socket對放在這里

            posted on 2006-04-20 17:34 楊粼波 閱讀(1507) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            久久最近最新中文字幕大全 | 亚洲国产天堂久久综合网站| 久久久久久无码Av成人影院| 日本道色综合久久影院| 久久精品国产亚洲精品| 亚洲色大成网站WWW久久九九| 好久久免费视频高清| 久久高潮一级毛片免费| 偷偷做久久久久网站| 精品九九久久国内精品| 久久99久国产麻精品66| 久久精品免费观看| 午夜欧美精品久久久久久久| 国产亚洲美女精品久久久| 久久久噜噜噜久久中文福利| 久久噜噜久久久精品66| 成人久久综合网| 亚洲国产精品无码久久SM| 国产午夜精品久久久久九九| 久久这里只有精品18| 青草久久久国产线免观| 狠狠久久综合| 国产精品久久久久久一区二区三区 | 久久WWW免费人成—看片| 成人国内精品久久久久一区 | 久久久久亚洲AV成人片 | 亚洲国产小视频精品久久久三级| 久久国产精品-久久精品| 久久久久亚洲AV片无码下载蜜桃| 久久人妻AV中文字幕| 国产香蕉久久精品综合网| 久久成人精品| 亚洲а∨天堂久久精品9966| 久久精品国产一区二区三区| 久久av高潮av无码av喷吹| 久久精品国产精品青草app| 99久久久精品免费观看国产| 久久精品人人做人人爽电影蜜月| 久久国产欧美日韩精品| 久久精品国产免费| 久久天天躁狠狠躁夜夜2020老熟妇|