青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(1517) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久爱91午夜羞羞| 国产日韩一区| 亚洲自拍高清| 亚洲一区二区成人| 亚洲在线免费| 欧美伊人久久久久久午夜久久久久| 一区二区三区四区五区在线| 亚洲另类视频| 午夜精品久久久久久久久| 久久都是精品| 欧美激情日韩| 国产女主播在线一区二区| 亚洲电影一级黄| 亚洲午夜女主播在线直播| 久久精品人人爽| 91久久在线播放| 中文久久乱码一区二区| 久久久久久9| 欧美日韩高清在线观看| 国产香蕉久久精品综合网| 亚洲高清网站| 欧美亚洲色图校园春色| 欧美激情a∨在线视频播放| 一级成人国产| 久久人人爽国产| 欧美视频网址| 亚洲国产另类久久久精品极度| 亚洲欧美日本日韩| 一本久道久久综合狠狠爱| 欧美一区二区日韩一区二区| 欧美激情在线免费观看| 亚洲免费网站| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲女人av| 久久亚洲综合色| 国产精品美女久久久久久久 | 免费亚洲电影在线观看| 亚洲一区久久| 欧美日韩精品三区| 一区二区三区在线观看欧美| 亚洲在线免费| 亚洲人成网站在线观看播放| 亚洲自拍三区| 国产精品日韩一区二区三区| 在线亚洲高清视频| 亚洲第一精品久久忘忧草社区| 午夜精品久久久99热福利| 欧美日韩国产三级| 99精品热6080yy久久 | 欧美一区二区三区播放老司机| 亚洲国产精品va在线看黑人| 久久超碰97中文字幕| 国产精品一二三视频| 亚洲天堂av在线免费| 亚洲免费观看高清在线观看| 麻豆乱码国产一区二区三区| 在线成人免费观看| 欧美福利视频在线观看| 老鸭窝91久久精品色噜噜导演| 韩国女主播一区二区三区| 久久精品在线播放| 欧美在线观看视频一区二区三区| 国产欧美日韩综合| 久久黄色级2电影| 久久精品国产久精国产一老狼| 黄色一区二区三区四区| 美女免费视频一区| 免费观看成人www动漫视频| 亚洲国产岛国毛片在线| 欧美激情中文字幕乱码免费| 免费成人在线观看视频| 99re6这里只有精品视频在线观看| 亚洲国产美女精品久久久久∴| 欧美第一黄网免费网站| 亚洲免费观看高清在线观看| 亚洲美女精品成人在线视频| 欧美视频手机在线| 久久久国产一区二区三区| 久久人体大胆视频| 欧美精品一区在线发布| 国产精品v亚洲精品v日韩精品 | 亚洲国产美女| 欧美日韩一区二区视频在线观看| 夜夜夜精品看看| 亚洲自拍偷拍视频| 一区在线观看| 亚洲人永久免费| 国产欧美精品日韩| 欧美成人影音| 国产精品高精视频免费| 久久精品一区二区三区不卡牛牛| 久久久噜噜噜久久久| 一区二区三区高清在线| 欧美一区久久| 夜夜嗨av一区二区三区| 久久精品91久久久久久再现| 亚洲日本一区二区三区| 性久久久久久久久久久久| 亚洲第一区在线| 亚洲欧美清纯在线制服| 亚洲开发第一视频在线播放| 午夜精品久久久久久久男人的天堂 | 亚洲欧洲一区二区三区在线观看 | 亚洲欧美日韩专区| 亚洲欧洲一区二区三区久久| 一本综合精品| 亚洲精品免费电影| 久久精品99无色码中文字幕| 亚洲一区在线播放| 欧美sm极限捆绑bd| 久久国产精品99精品国产| 欧美日本三级| 欧美va亚洲va香蕉在线| 国产欧美综合在线| 一区二区三区精品| 日韩天堂av| 久久久久亚洲综合| 欧美在线视频一区| 欧美偷拍另类| 亚洲日本在线视频观看| 黄色亚洲在线| 欧美中文在线免费| 久久成人精品| 国产视频在线观看一区二区三区| 亚洲精品中文字幕女同| 91久久久亚洲精品| 另类激情亚洲| 免费在线看成人av| 一区二区视频在线观看| 欧美在线视频导航| 久久精品国产清自在天天线| 国产精品高潮视频| 亚洲视频免费在线| 亚洲一级黄色| 欧美日韩美女在线观看| 夜夜嗨av一区二区三区四季av| 一区二区三区 在线观看视| 欧美成黄导航| 欧美成人精品三级在线观看| 99精品国产在热久久| 亚洲乱码日产精品bd| 日韩视频在线免费| 在线国产精品播放| 中文一区二区在线观看| 亚洲一区二区少妇| 欧美体内谢she精2性欧美| 亚洲精品一区二区网址| 亚洲一区国产视频| 国产精品女主播| 欧美一区二区视频免费观看| 久久精品在线播放| 1000部精品久久久久久久久| 久久资源在线| 亚洲激情一区二区| 亚洲一区二区高清| 国产欧美精品一区aⅴ影院| 欧美在线亚洲一区| 欧美国产日韩精品| 中文av一区特黄| 国产亚洲视频在线观看| 美女主播一区| 在线一区亚洲| 久久看片网站| 日韩五码在线| 国产精品免费网站| 久久久久久久综合日本| 亚洲电影第1页| 亚洲男人的天堂在线| 国产一区二区成人| 欧美激情在线播放| 欧美一区二区三区电影在线观看| 欧美大片免费久久精品三p| 一区二区久久久久久| 国产人妖伪娘一区91| 欧美大学生性色视频| 亚洲欧美另类国产| 亚洲高清不卡一区| 久久精品理论片| 一本色道精品久久一区二区三区| 国产亚洲电影| 欧美三级免费| 蜜桃av综合| 午夜欧美精品| 日韩亚洲成人av在线| 欧美大片免费观看| 久久精品99国产精品酒店日本| 一区二区三区高清不卡| 亚洲大片av| 国产精品腿扒开做爽爽爽挤奶网站| 蜜臀av一级做a爰片久久| 亚洲欧美自拍偷拍| 夜夜嗨av一区二区三区网页| 美女国产精品| 久久久久高清| 欧美在线视频一区二区| 性欧美长视频| 亚洲视频免费看| 一区二区三区成人精品| 日韩午夜在线| 一区二区三区日韩|