亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: zhoulifa
打印 上一主題 下一主題

Linux網(wǎng)絡(luò)編程一步一步學(xué)-IPv6下網(wǎng)絡(luò)編程步驟 [復(fù)制鏈接]

論壇徽章:
0
11 [報告]
發(fā)表于 2007-02-03 22:51 |只看該作者
是啊,支持

論壇徽章:
0
12 [報告]
發(fā)表于 2007-02-03 23:51 |只看該作者
現(xiàn)在有代碼都實現(xiàn)IPV4和IPV6通用了,支持精神!

論壇徽章:
0
13 [報告]
發(fā)表于 2007-02-04 12:23 |只看該作者
原帖由 converse 于 2007-2-3 22:32 發(fā)表
>>還請告訴我如何將此全部發(fā)到這里。
汗,你就把帖子一個一個的貼在這個帖子里面就好了,我敢打賭會N熱門的~~


那我就當(dāng)一回搬運工了。不過我覺得這種方式比較那個,好象與咱們信息化時代不太相符哦

論壇徽章:
0
14 [報告]
發(fā)表于 2007-02-04 12:29 |只看該作者
原帖由 zhoulifa 于 2007-2-4 12:23 發(fā)表


那我就當(dāng)一回搬運工了。不過我覺得這種方式比較那個,好象與咱們信息化時代不太相符哦


或者在某個帖子里面一次過把所有帖子的鏈接都放進來,我說的方案都是為了方便別人查看你的帖子罷了。

論壇徽章:
0
15 [報告]
發(fā)表于 2007-02-04 12:30 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-簡單客戶端編寫


  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <stdlib.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>

  10. #define MAXBUF 1024
  11. /************關(guān)于本文檔********************************************
  12. *filename: simple-socket.c
  13. *purpose: 演示最基本的網(wǎng)絡(luò)編程步驟,這是個客戶端程序
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-23 19:41:54
  17. *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
  20. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  21. *********************************************************************/
  22. int main(int argc, char **argv)
  23. {
  24.     int sockfd;
  25.     struct sockaddr_in dest;
  26.     char buffer[MAXBUF];

  27.     if (argc != 3) {
  28.         printf
  29.             ("參數(shù)格式錯誤!正確用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",
  30.              argv[0], argv[0]);
  31.         exit(0);
  32.     }
  33.     /* 創(chuàng)建一個 socket 用于 tcp 通信 */
  34.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  35.         perror("Socket");
  36.         exit(errno);
  37.     }

  38.     /* 初始化服務(wù)器端(對方)的地址和端口信息 */
  39.     bzero(&dest, sizeof(dest));
  40.     dest.sin_family = AF_INET;
  41.     dest.sin_port = htons(atoi(argv[2]));
  42.     if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
  43.         perror(argv[1]);
  44.         exit(errno);
  45.     }

  46.     /* 連接服務(wù)器 */
  47.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
  48.         perror("Connect ");
  49.         exit(errno);
  50.     }

  51.     /* 接收對方發(fā)過來的消息,最多接收 MAXBUF 個字節(jié) */
  52.     bzero(buffer, MAXBUF);
  53.     recv(sockfd, buffer, sizeof(buffer), 0);
  54.     printf("%s", buffer);

  55.     /* 關(guān)閉連接 */
  56.     close(sockfd);
  57.     return 0;
  58. }
復(fù)制代碼

編譯此程序使用如下命令:
gcc -Wall simple-socket.c

運行此程序使用如下命令(假設(shè)你的主機上開啟了ssh服務(wù)):
./a.out 127.0.0.1 22


其實socket客戶端編程相當(dāng)簡單:
第1步:建立一個socket句柄,用socket()函數(shù);
第2步:設(shè)定你要連接的服務(wù)器的IP地址和端口等信息;
第3步:與服務(wù)器建立連接,用connect函數(shù);
第4步:收發(fā)消息,用recv(sockfd,...)/send(sockfd,...)或者read(sockfd,...)/write(sockfd,...)都可以;
第5步:通訊結(jié)束后關(guān)閉連接,用close()函數(shù)即可,當(dāng)然也有人用shutdown()函數(shù)。


[ 本帖最后由 zhoulifa 于 2007-2-4 12:48 編輯 ]

論壇徽章:
0
16 [報告]
發(fā)表于 2007-02-04 12:50 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-綁定IP和端口

為了服務(wù)器的安全,有些服務(wù)器要求客戶端只能以指定的IP地址和特定的端口才能連接上來。這就要求我們客戶端連接之前綁定IP地址和端口信息。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <stdlib.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>

  10. #define MAXBUF 1024
  11. /************關(guān)于本文檔********************************************
  12. *filename: simple-bind.c
  13. *purpose: 演示最基本的網(wǎng)絡(luò)編程步驟,這是個客戶端程序以固定 IP 和端口連接服務(wù)器
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-23 19:51:54
  17. *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
  20. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  21. *********************************************************************/
  22. int main(int argc, char **argv)
  23. {
  24.     int sockfd;
  25.     struct sockaddr_in dest, mine;
  26.     char buffer[MAXBUF];

  27.     if (argc != 5) {
  28.         printf
  29.             ("參數(shù)格式錯誤!正確用法如下:\n\t\t%s 對方IP地址 對方端口 本機IP地址 本機端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來以本機固定的端口從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",
  30.              argv[0], argv[0]);
  31.         exit(0);
  32.     }
  33.     /* 創(chuàng)建一個 socket 用于 tcp 通信 */
  34.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  35.         perror("Socket");
  36.         exit(errno);
  37.     }

  38.     /* 初始化服務(wù)器端(對方)的地址和端口信息 */
  39.     bzero(&dest, sizeof(dest));
  40.     dest.sin_family = AF_INET;
  41.     dest.sin_port = htons(atoi(argv[2]));
  42.     if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
  43.         perror(argv[1]);
  44.         exit(errno);
  45.     }

  46.     /* 初始化自己的地址和端口信息 */
  47.     bzero(&mine, sizeof(mine));
  48.     mine.sin_family = AF_INET;
  49.     mine.sin_port = htons(atoi(argv[4]));
  50.     if (inet_aton(argv[3], (struct in_addr *) &mine.sin_addr.s_addr) == 0) {
  51.         perror(argv[3]);
  52.         exit(errno);
  53.     }

  54.     /* 把自己的 IP 地址信息和端口與 socket 綁定 */
  55.     if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) ==
  56.         -1) {
  57.         perror(argv[3]);
  58.         exit(errno);
  59.     }

  60.     /* 以自己特定的端口和IP連接服務(wù)器的特定端口 */
  61.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
  62.         perror("Connect ");
  63.         exit(errno);
  64.     }

  65.     /* 接收對方發(fā)過來的消息,最多接收 MAXBUF 個字節(jié) */
  66.     bzero(buffer, MAXBUF);
  67.     recv(sockfd, buffer, sizeof(buffer), 0);
  68.     printf("%s", buffer);
  69.     sleep(10);
  70.     /* 關(guān)閉連接 */
  71.     close(sockfd);
  72.     return 0;
  73. }
復(fù)制代碼

編譯程序用此命令:
gcc -Wall simple-bind.c

運行程序用此命令:
./a.out 127.0.0.1 22 127.0.0.1 3000

同時可以用下列netstat命令查看網(wǎng)絡(luò)連接狀態(tài):
netstat -an|grep 3000

查看到如下信息:
tcp 0 0 127.0.0.1:3000 127.0.0.1:22 ESTABLISHED


與前面一份源代碼相比,這里多了設(shè)置自己的IP地址和端口信息,所以編程過程變成了:
第1步:建立一個socket句柄,用socket()函數(shù);
第2步:設(shè)定你要連接的服務(wù)器的IP地址和端口等信息;
第x步:設(shè)定你自己的IP地址和端口等信息與socket綁定,用bind()函數(shù); #與前面相比就是多了這一個步驟
第3步:與服務(wù)器建立連接,用connect函數(shù);
第4步:收發(fā)消息,用recv(sockfd,...)/send(sockfd,...)或者read(sockfd,...)/write(sockfd,...)都可以;
第5步:通訊結(jié)束后關(guān)閉連接,用close()函數(shù)即可,當(dāng)然也有人用shutdown()函數(shù)。

[ 本帖最后由 zhoulifa 于 2007-2-4 12:55 編輯 ]

論壇徽章:
0
17 [報告]
發(fā)表于 2007-02-04 12:57 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-循環(huán)讀取服務(wù)器上的數(shù)據(jù)


  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <stdlib.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>

  10. #define MAXBUF 10
  11. /************關(guān)于本文檔********************************************
  12. *filename: simple-readall.c
  13. *purpose: 演示最基本的網(wǎng)絡(luò)編程,循環(huán)讀取服務(wù)器上發(fā)過來的內(nèi)容,直到讀完為止
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-23 20:16:54
  17. *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
  20. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  21. *********************************************************************/
  22. int main(int argc, char **argv)
  23. {
  24.     int sockfd, ret;
  25.     struct sockaddr_in dest, mine;
  26.     char buffer[MAXBUF + 1];

  27.     if (argc != 5) {
  28.         printf
  29.             ("參數(shù)格式錯誤!正確用法如下:\n\t\t%s 對方IP地址 對方端口 本機IP地址 本機端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來以本機固定的端口從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",
  30.              argv[0], argv[0]);
  31.         exit(0);
  32.     }
  33.     /* 創(chuàng)建一個 socket 用于 tcp 通信 */
  34.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  35.         perror("Socket");
  36.         exit(errno);
  37.     }

  38.     /* 初始化服務(wù)器端(對方)的地址和端口信息 */
  39.     bzero(&dest, sizeof(dest));
  40.     dest.sin_family = AF_INET;
  41.     dest.sin_port = htons(atoi(argv[2]));
  42.     if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
  43.         perror(argv[1]);
  44.         exit(errno);
  45.     }

  46.     /* 初始化自己的地址和端口信息 */
  47.     bzero(&mine, sizeof(mine));
  48.     mine.sin_family = AF_INET;
  49.     mine.sin_port = htons(atoi(argv[4]));
  50.     if (inet_aton(argv[3], (struct in_addr *) &mine.sin_addr.s_addr) == 0) {
  51.         perror(argv[3]);
  52.         exit(errno);
  53.     }

  54.     /* 把自己的 IP 地址信息和端口與 socket 綁定 */
  55.     if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) ==
  56.         -1) {
  57.         perror(argv[3]);
  58.         exit(errno);
  59.     }

  60.     /* 連接服務(wù)器 */
  61.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
  62.         perror("Connect ");
  63.         exit(errno);
  64.     }

  65.     /* 接收對方發(fā)過來的消息,每次最多接收 MAXBUF 個字節(jié),直到把對方發(fā)過來的所有消息接收完畢為止 */
  66.     do {
  67.         bzero(buffer, MAXBUF + 1);
  68.         ret = recv(sockfd, buffer, MAXBUF, 0);
  69.         printf("讀到%d個字節(jié),它們是:'%s'\n", ret, buffer);
  70.     } while (ret == MAXBUF);

  71.     /* 關(guān)閉連接 */
  72.     close(sockfd);
  73.     return 0;
  74. }
復(fù)制代碼

編譯程序使用如下命令:
gcc -Wall simple-readall.c

運行程序用如下命令:
./a.out 127.0.0.1 22 127.0.0.1 3000

此程序運行結(jié)果如下:
讀到10個字節(jié),它們是:'SSH-2.0-Op'
讀到10個字節(jié),它們是:'enSSH_4.3p'
讀到10個字節(jié),它們是:'2 Debian-5'
讀到8個字節(jié),它們是:'ubuntu1
'

注意:如果你運行時程序長久沒有退出,請把程序的第一行:
#define MAXBUF 10

稍微改一下,比如改成下面的:
#define MAXBUF 9

再編譯運行試試。
為什么?請繼續(xù)看下一篇文章“設(shè)置非阻塞方式”。

論壇徽章:
0
18 [報告]
發(fā)表于 2007-02-04 13:00 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-設(shè)置非阻塞方式

[code]
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>

#define MAXBUF 10
/************關(guān)于本文檔********************************************
*filename: simple-nonblock.c
*purpose: 演示最基本的網(wǎng)絡(luò)編程,循環(huán)讀取服務(wù)器上發(fā)過來的內(nèi)容,直到讀完為止
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
*date time:2007-01-23 20:46:54
*Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
* 但請遵循GPL
*Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*********************************************************************/
int main(int argc, char **argv)
{
    int sockfd, ret, rcvtm = 0;
    struct sockaddr_in dest, mine;
    char buffer[MAXBUF + 1];

    if (argc != 5) {
        printf
            ("參數(shù)格式錯誤!正確用法如下:\n\t\t%s 對方IP地址 對方端口 本機IP地址 本機端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來以本機固定的端口從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",
             argv[0], argv[0]);
        exit(0);
    }

    /* 創(chuàng)建一個 socket 用于 tcp 通信 */
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket");
        exit(errno);
    }

    /* 初始化服務(wù)器端(對方)的地址和端口信息 */
    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(atoi(argv[2]));
    if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
        perror(argv[1]);
        exit(errno);
    }

    /* 初始化自己的地址和端口信息 */
    bzero(&mine, sizeof(mine));
    mine.sin_family = AF_INET;
    mine.sin_port = htons(atoi(argv[4]));
    if (inet_aton(argv[3], (struct in_addr *) &mine.sin_addr.s_addr) == 0) {
        perror(argv[3]);
        exit(errno);
    }

    /* 把自己的 IP 地址信息和端口與 socket 綁定 */
    if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) ==
        -1) {
        perror(argv[3]);
        exit(errno);
    }

    /* 連接服務(wù)器 */
    if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
        perror("Connect ");
        exit(errno);
    }

    /* 設(shè)置 socket 屬性為非阻塞方式 */
    if (fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) {
        perror("fcntl");
        exit(errno);
    }

    /* 接收對方發(fā)過來的消息,每次最多接收 MAXBUF 個字節(jié),直到把對方發(fā)過來的所有消息接收完畢為止 */
    do {
      _retry:
        bzero(buffer, MAXBUF + 1);
        ret = recv(sockfd, buffer, MAXBUF, 0);
        if (ret > 0)
            printf("讀到%d個字節(jié),它們是:'%s'\n", ret, buffer);

        if (ret < 0) {
            if (errno == EAGAIN) {
                if (rcvtm)
                    break;
                else {
                    printf("數(shù)據(jù)還未到達!\n");
                    usleep(100000);
                    goto _retry;
                };
            };
            printf("接收出錯了!\n");
            perror("recv");
        }
        rcvtm++;
    } while (ret == MAXBUF);

    /* 關(guān)閉連接 */
    close(sockfd);
    return 0;
}
[code]
編譯程序用下列命令:
gcc -Wall simple-nonblock.c

運行程序用下列命令:
./a.out 127.0.0.1 21 127.0.0.1 3000

程序運行輸出結(jié)果如下:
數(shù)據(jù)還未到達!
讀到10個字節(jié),它們是:'220 (vsFTP'
讀到10個字節(jié),它們是:'d 2.0.4)
'


問題:

1、非阻塞是什么?
網(wǎng)絡(luò)通信有阻塞和非阻塞之分,例如對于接收數(shù)據(jù)的函數(shù)recv:在阻塞方式下,沒有數(shù)據(jù)到達時,即接收不到數(shù)據(jù)時,程序會停在recv函數(shù)這里等待數(shù)據(jù)的到來;而在非阻塞方式下就不會等,如果沒有數(shù)據(jù)可接收就立即返回-1表示接收失敗。
2、什么是errno?
errno是Linux系統(tǒng)下保存當(dāng)前狀態(tài)的一個公共變量,當(dāng)前程序運行時進行系統(tǒng)調(diào)用如果出錯,則會設(shè)置errno為某個值以告訴用戶出了什么錯誤?梢杂胮rintf("%d %s\n", errno, strerror(errno));得到具體信息。
3、什么是EAGAIN?
man recv
當(dāng)recv系統(tǒng)調(diào)用返回這個值時表示recv讀數(shù)據(jù)時,對方?jīng)]有發(fā)送數(shù)據(jù)過來。

論壇徽章:
0
19 [報告]
發(fā)表于 2007-02-04 13:11 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-開啟網(wǎng)絡(luò)監(jiān)聽服務(wù)


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <unistd.h>
  10. #include <arpa/inet.h>

  11. /************關(guān)于本文檔********************************************
  12. *filename: simple-listen.c
  13. *purpose: 演示最基本的網(wǎng)絡(luò)編程步驟,開啟服務(wù)端的監(jiān)聽,等待客戶端來連接
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-24 12:31:00
  17. *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
  20. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  21. *********************************************************************/

  22. int main(int argc, char **argv)
  23. {
  24.     int sockfd;
  25.     struct sockaddr_in my_addr;
  26.     unsigned int myport, lisnum;

  27.     if (argv[1])
  28.         myport = atoi(argv[1]);
  29.     else
  30.         myport = 7838;

  31.     if (argv[2])
  32.         lisnum = atoi(argv[2]);
  33.     else
  34.         lisnum = 2;

  35.     if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
  36.         perror("socket");
  37.         exit(1);
  38.     } else
  39.         printf("socket created\n");

  40.     bzero(&my_addr, sizeof(my_addr));
  41.     my_addr.sin_family = PF_INET;
  42.     my_addr.sin_port = htons(myport);
  43.     if (argv[3])
  44.         my_addr.sin_addr.s_addr = inet_addr(argv[3]);
  45.     else
  46.         my_addr.sin_addr.s_addr = INADDR_ANY;

  47.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
  48.         == -1) {
  49.         perror("bind");
  50.         exit(1);
  51.     } else
  52.         printf("binded\n");

  53.     if (listen(sockfd, lisnum) == -1) {
  54.         perror("listen");
  55.         exit(1);
  56.     } else
  57.         printf("begin listen\n");

  58.     sleep(100);
  59.     close(sockfd);
  60.     return 0;
  61. }
復(fù)制代碼

編譯程序用下列命令:
gcc -Wall simple-listen.c

運行程序用如下命令:
./a.out 7838 2

這將在你自己主機的所有IP地址是等待客戶端連接。比如你的網(wǎng)卡lo的IP地址127.0.0.1,又比如你的網(wǎng)卡eth0的IP地址192.168.0.100
如果要指定只在某個地址是開啟監(jiān)聽服務(wù),可以用下面的命令:
./a.out 7838 2 127.0.0.1

這樣,客戶端只能通過127.0.0.1的7838端口連接你的程序。
你可以開啟一個終端輸入telnet 127.0.0.1 7838來測試是否能連接成功。
同時可以用netstat -an|grep 7838命令來查看網(wǎng)絡(luò)是否連接正常

其實socket服務(wù)器端編程也是相當(dāng)簡單的:
第1步:建立一個socket句柄,用socket()函數(shù);
第2步:設(shè)定自己服務(wù)器的IP地址和端口等信息,是用于讓對方連接的;
第3步:把自己的IP地址和端口等信息與socket綁定,用bind()函數(shù);
第4步:開啟監(jiān)聽服務(wù),用listen()函數(shù);    #至此,客戶端已經(jīng)能連接你這個IP地址和端口了
注:但由于我們還沒有接受客戶端的連接,沒有建立用于消息收發(fā)的socket句柄,所以客戶端還沒法一客戶端進行消息收發(fā)。

論壇徽章:
0
20 [報告]
發(fā)表于 2007-02-04 13:19 |只看該作者

Linux網(wǎng)絡(luò)編程一步一步學(xué)-接受客戶端連接請求


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <unistd.h>
  10. #include <arpa/inet.h>

  11. /************關(guān)于本文檔********************************************
  12. *filename: simple-accept.c
  13. *purpose: 演示最基本的網(wǎng)絡(luò)編程步驟,開啟服務(wù)端的監(jiān)聽,并接收每個客戶端的連接請求
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-24 12:41
  17. *Note: 任何人可以任意復(fù)制代碼并運用這些文檔,當(dāng)然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Hope:希望越來越多的人貢獻自己的力量,為科學(xué)技術(shù)發(fā)展出力
  20. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  21. *********************************************************************/

  22. int main(int argc, char **argv)
  23. {
  24.     int sockfd, new_fd;
  25.     socklen_t len;
  26.     struct sockaddr_in my_addr, their_addr;
  27.     unsigned int myport, lisnum;

  28.     if (argv[1])
  29.         myport = atoi(argv[1]);
  30.     else
  31.         myport = 7838;

  32.     if (argv[2])
  33.         lisnum = atoi(argv[2]);
  34.     else
  35.         lisnum = 2;

  36.     if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
  37.         perror("socket");
  38.         exit(1);
  39.     } else
  40.         printf("socket created\n");

  41.     bzero(&my_addr, sizeof(my_addr));
  42.     my_addr.sin_family = PF_INET;
  43.     my_addr.sin_port = htons(myport);
  44.     if (argv[3])
  45.         my_addr.sin_addr.s_addr = inet_addr(argv[3]);
  46.     else
  47.         my_addr.sin_addr.s_addr = INADDR_ANY;

  48.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
  49.         == -1) {
  50.         perror("bind");
  51.         exit(1);
  52.     } else
  53.         printf("binded\n");

  54.     if (listen(sockfd, lisnum) == -1) {
  55.         perror("listen");
  56.         exit(1);
  57.     } else
  58.         printf("begin listen\n");

  59.     while (1) {
  60.         len = sizeof(struct sockaddr);
  61.         if ((new_fd =
  62.              accept(sockfd, (struct sockaddr *) &their_addr,
  63.                     &len)) == -1) {
  64.             perror("accept");
  65.             exit(errno);
  66.         } else
  67.             printf("server: got connection from %s, port %d, socket %d\n",
  68.                    inet_ntoa(their_addr.sin_addr),
  69.                    ntohs(their_addr.sin_port), new_fd);
  70.     }

  71.     close(sockfd);
  72.     return 0;
  73. }
復(fù)制代碼

編譯程序用下列命令:
gcc -Wall simple-accept.c

運行程序用如下命令:
./a.out 7838 1 127.0.0.1

另外開多幾個客戶端程序連接上來,
程序輸出結(jié)果如下:
server: got connection from 127.0.0.1, port 15949, socket 4
server: got connection from 127.0.0.1, port 15950, socket 5
server: got connection from 127.0.0.1, port 15951, socket 6
server: got connection from 127.0.0.1, port 15952, socket 7


與上一篇相比,這里只是增加了accept函數(shù),這個函數(shù)會創(chuàng)建一個新的socket句柄,這個句柄才是我們真正可以用來通訊的句柄,即客戶端和服務(wù)端的消息收發(fā)是通過這個accept產(chǎn)生的socket進行的
accpet是一個典型的阻塞函數(shù),即程序會停止在accept函數(shù)處直到有客戶端連接上來才會返回。

[ 本帖最后由 zhoulifa 于 2007-2-4 13:37 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP