<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    說明 前一篇


    所有的WinSock函數(shù)都使用sockaddr結(jié)構(gòu)來傳遞地址信息,該結(jié)構(gòu)定義如下:

    struct sockaddr {

    u_short sa_family; /* address family */
    char sa_data[14];/* up to 14 bytes of direct address */
    };

    需要注意的是,socket并不只是為TCP服務(wù)的,它支持多種協(xié)議,而各種協(xié)議的地址格式又大相徑庭。因此,我們在socket相關(guān)的API中不 可能用同樣的地址結(jié)構(gòu)來描述地址信息,這里的sockaddr只是一個(gè)占位符的角色,我們在實(shí)際編程中必須替換乘合適的地址類型。

    對于TCP/IP族,我們需要用的結(jié)構(gòu)類型是sockaddr_in,該結(jié)構(gòu)定義如下:

    struct sockaddr_in {

    short sin_family;
    u_short sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];

    };
    其中in_addr定義為:
    struct in_addr {
    union {
    struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
    struct { u_short s_w1,s_w2; } S_un_w;
    u_long S_addr;
    } S_un;
    #define s_addr S_un.S_addr
    /* can be used for most tcp & ip code */
    #define s_host S_un.S_un_b.s_b2
    /* host on imp */
    #define s_net S_un.S_un_b.s_b1
    /* network */
    #define s_imp S_un.S_un_w.s_w2
    /* imp */
    #define s_impno S_un.S_un_b.s_b4
    /* imp # */
    #define s_lh S_un.S_un_b.s_b3
    /* logical host */
    };

    需要注意的是,這個(gè)sockaddr_in結(jié)構(gòu)和sockaddr結(jié)構(gòu)尺寸一樣,我不清楚這是巧合還是必須遵守的一個(gè)準(zhǔn)則。在我看來,這個(gè)結(jié)構(gòu)不一樣也是可以的。

    我不打算一一介紹各個(gè)宏和域的含義,因?yàn)榻^大多數(shù)人都不會記住這個(gè)。我只想簡要介紹一下如何初始化這個(gè)地址信息

    1. sa_family:這個(gè)域描述了地址族信息。對于TCP/IP,這個(gè)值必須設(shè)置為AF_INET。有興趣的朋友可以到WinSock.H中找找看它還支持哪些值。
    2. sin_port:端口號,對于我們提供的端口號,必須用htons轉(zhuǎn)換一下再賦值,方法是:
      addr.sin_port = htons(port);
    3. sin_addr:地址,這里應(yīng)該是IP地址。我們可以用inet_addr函數(shù)從點(diǎn)分式IP地址轉(zhuǎn)換得到這個(gè)IP地址,方法是:
      addr.sin_addr.s_addr = inet_addr("100.101.102.103");
      注意:這里使用了宏s_addr,該宏的定義請參考上文。
    4. sin_zero:填充信息,必須設(shè)置為0。初學(xué)編程的人往往忘記初始化這個(gè)域,根據(jù)我的經(jīng)驗(yàn),這會導(dǎo)致函數(shù)調(diào)用失敗。

    由于API中都使用sockaddr結(jié)構(gòu),因此在使用時(shí)必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,并提供結(jié)構(gòu)尺寸信息。下面就是accept函數(shù)調(diào)用時(shí)的例子:

    sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sa_family = AF_INET;
    int size = sizeof(addr);
    SOCKET sd = accept(serversd, (sockaddr*)&addr, &size);
    posted on 2008-07-03 15:16 SIMONE 閱讀(423) 評論(0)  編輯  收藏 所屬分類: C++
    主站蜘蛛池模板: 菠萝菠萝蜜在线免费视频| 精品人妻系列无码人妻免费视频| 最新中文字幕免费视频| 亚洲av乱码一区二区三区按摩| 国产亚洲情侣一区二区无码AV| 91av免费观看| 亚洲av色香蕉一区二区三区蜜桃| 国产精品亚洲片在线观看不卡| 久久久久久精品免费看SSS| 日韩欧美亚洲中文乱码| 亚洲国产AV无码专区亚洲AV | 性盈盈影院免费视频观看在线一区| 老牛精品亚洲成av人片| 亚洲AV无码不卡无码| 免费的一级黄色片| 任你躁在线精品免费| 亚洲日韩AV一区二区三区四区| 亚洲综合色婷婷七月丁香| 一二三四免费观看在线视频中文版| 尤物视频在线免费观看| 亚洲六月丁香婷婷综合| 久久久久久亚洲精品不卡| 免费观看成人毛片a片2008| 99re8这里有精品热视频免费| 亚洲一本到无码av中文字幕| 国产亚洲福利精品一区| 永久免费看mv网站入口| 99久久久国产精品免费牛牛 | 亚洲AV无码欧洲AV无码网站| 久久精品无码一区二区三区免费 | 很黄很色很刺激的视频免费| 成人无码WWW免费视频| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲美女在线观看播放| 国产成人亚洲精品91专区手机| 久久综合AV免费观看| 久久精品毛片免费观看| a视频免费在线观看| 黄色免费在线观看网址| 亚洲 欧洲 视频 伦小说| 亚洲成人在线电影|