亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? linux網(wǎng)絡(luò)編程一步一步學(xué)-異步通訊聊天程序select.txt

?? Linux網(wǎng)絡(luò)編程一步一步學(xué)-異步通訊聊天程序(select)
?? TXT
字號(hào):
Linux網(wǎng)絡(luò)編程一步一步學(xué)-異步通訊聊天程序select 
什么是異步通訊?
就是通訊任意一方可以任意發(fā)送消息,有消息來(lái)到時(shí)會(huì)收到系統(tǒng)提示去接收消息。

這里要用到select函數(shù)。使用步驟如下:
1、設(shè)置一個(gè)集合變量,用來(lái)存放所有要判斷的句柄(file descriptors:即我們建立的每個(gè)socket、用open打開(kāi)的每個(gè)文件等)
2、把需要判斷的句柄加入到集合里
3、設(shè)置判斷時(shí)間
4、開(kāi)始等待,即select
5、如果在設(shè)定的時(shí)間內(nèi)有任何句柄狀態(tài)變化了就馬上返回,并把句柄設(shè)置到集合里

服務(wù)器端源代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/types.h>

#define MAXBUF 1024
/************關(guān)于本文檔********************************************
*filename: async-server.c
*purpose: 演示網(wǎng)絡(luò)異步通訊,這是服務(wù)器端程序
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
Linux愛(ài)好者 Linux知識(shí)傳播者 SOHO族 開(kāi)發(fā)者 最擅長(zhǎng)C語(yǔ)言
*date time:2007-01-25 21:22
*Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途
* 但請(qǐng)遵循GPL
*Thanks to: Google.com
*Hope:希望越來(lái)越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進(jìn)步更快!感謝有開(kāi)源前輩的貢獻(xiàn)!
*********************************************************************/

int main(int argc, char **argv)
{
    int sockfd, new_fd;
    socklen_t len;
    struct sockaddr_in my_addr, their_addr;
    unsigned int myport, lisnum;
    char buf[MAXBUF + 1];
    fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;

    if (argv[1])
        myport = atoi(argv[1]);
    else
        myport = 7838;

    if (argv[2])
        lisnum = atoi(argv[2]);
    else
        lisnum = 2;

    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = PF_INET;
    my_addr.sin_port = htons(myport);
    if (argv[3])
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);
    else
        my_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
        == -1) {
        perror("bind");
        exit(1);
    }

    if (listen(sockfd, lisnum) == -1) {
        perror("listen");
        exit(1);
    }

    while (1) {
        printf
            ("\n----等待新的連接到來(lái)開(kāi)始新一輪聊天……\n");
        len = sizeof(struct sockaddr);
        if ((new_fd =
             accept(sockfd, (struct sockaddr *) &their_addr,
                    &len)) == -1) {
            perror("accept");
            exit(errno);
        } else
            printf("server: got connection from %s, port %d, socket %d\n",
                   inet_ntoa(their_addr.sin_addr),
                   ntohs(their_addr.sin_port), new_fd);

        /* 開(kāi)始處理每個(gè)新連接上的數(shù)據(jù)收發(fā) */
        printf
            ("\n準(zhǔn)備就緒,可以開(kāi)始聊天了……直接輸入消息回車即可發(fā)信息給對(duì)方\n");
        while (1) {
            /* 把集合清空 */
            FD_ZERO(&rfds);
            /* 把標(biāo)準(zhǔn)輸入句柄0加入到集合中 */
            FD_SET(0, &rfds);
            maxfd = 0;
            /* 把當(dāng)前連接句柄new_fd加入到集合中 */
            FD_SET(new_fd, &rfds);
            if (new_fd > maxfd)
                maxfd = new_fd;
            /* 設(shè)置最大等待時(shí)間 */
            tv.tv_sec = 1;
            tv.tv_usec = 0;
            /* 開(kāi)始等待 */
            retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
            if (retval == -1) {
                printf("將退出,select出錯(cuò)! %s", strerror(errno));
                break;
            } else if (retval == 0) {
                /* printf
                   ("沒(méi)有任何消息到來(lái),用戶也沒(méi)有按鍵,繼續(xù)等待……\n"); */
                continue;
            } else {
                if (FD_ISSET(0, &rfds)) {
                    /* 用戶按鍵了,則讀取用戶輸入的內(nèi)容發(fā)送出去 */
                    bzero(buf, MAXBUF + 1);
                    fgets(buf, MAXBUF, stdin);
                    if (!strncasecmp(buf, "quit", 4)) {
                        printf("自己請(qǐng)求終止聊天!\n");
                        break;
                    }
                    len = send(new_fd, buf, strlen(buf) - 1, 0);
                    if (len > 0)
                        printf
                            ("消息:%s\t發(fā)送成功,共發(fā)送了%d個(gè)字節(jié)!\n",
                             buf, len);
                    else {
                        printf
                            ("消息'%s'發(fā)送失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",
                             buf, errno, strerror(errno));
                        break;
                    }
                }
                if (FD_ISSET(new_fd, &rfds)) {
                    /* 當(dāng)前連接的socket上有消息到來(lái)則接收對(duì)方發(fā)過(guò)來(lái)的消息并顯示 */
                    bzero(buf, MAXBUF + 1);
                    /* 接收客戶端的消息 */
                    len = recv(new_fd, buf, MAXBUF, 0);
                    if (len > 0)
                        printf
                            ("接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n",
                             buf, len);
                    else {
                        if (len < 0)
                            printf
                                ("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",
                                 errno, strerror(errno));
                        else
                            printf("對(duì)方退出了,聊天終止\n");
                        break;
                    }
                }
            }
        }
        close(new_fd);
        /* 處理每個(gè)新連接上的數(shù)據(jù)收發(fā)結(jié)束 */
        printf("還要和其它連接聊天嗎?(no->退出)");
        fflush(stdout);
        bzero(buf, MAXBUF + 1);
        fgets(buf, MAXBUF, stdin);
        if (!strncasecmp(buf, "no", 2)) {
            printf("終止聊天!\n");
            break;
        }
    }

    close(sockfd);
    return 0;
}
 
客戶端源代碼如下:
#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 <sys/time.h>
#include <sys/types.h>

#define MAXBUF 1024
/************關(guān)于本文檔********************************************
// *filename: ssync-client.c
*purpose: 演示網(wǎng)絡(luò)異步通訊,這是客戶端程序
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
Linux愛(ài)好者 Linux知識(shí)傳播者 SOHO族 開(kāi)發(fā)者 最擅長(zhǎng)C語(yǔ)言
*date time:2007-01-25 21:32
*Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途
* 但請(qǐng)遵循GPL
*Thanks to: Google.com
*Hope:希望越來(lái)越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力
* 科技站在巨人的肩膀上進(jìn)步更快!感謝有開(kāi)源前輩的貢獻(xiàn)!
*********************************************************************/
int main(int argc, char **argv)
{
    int sockfd, len;
    struct sockaddr_in dest;
    char buffer[MAXBUF + 1];
    fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;

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

    /* 初始化服務(wù)器端(對(duì)方)的地址和端口信息 */
    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);
    }

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

    printf
        ("\n準(zhǔn)備就緒,可以開(kāi)始聊天了……直接輸入消息回車即可發(fā)信息給對(duì)方\n");
    while (1) {
        /* 把集合清空 */
        FD_ZERO(&rfds);
        /* 把標(biāo)準(zhǔn)輸入句柄0加入到集合中 */
        FD_SET(0, &rfds);
        maxfd = 0;
        /* 把當(dāng)前連接句柄sockfd加入到集合中 */
        FD_SET(sockfd, &rfds);
        if (sockfd > maxfd)
            maxfd = sockfd;
        /* 設(shè)置最大等待時(shí)間 */
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        /* 開(kāi)始等待 */
        retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
        if (retval == -1) {
            printf("將退出,select出錯(cuò)! %s", strerror(errno));
            break;
        } else if (retval == 0) {
            /* printf
               ("沒(méi)有任何消息到來(lái),用戶也沒(méi)有按鍵,繼續(xù)等待……\n"); */
            continue;
        } else {
            if (FD_ISSET(sockfd, &rfds)) {
                /* 連接的socket上有消息到來(lái)則接收對(duì)方發(fā)過(guò)來(lái)的消息并顯示 */
                bzero(buffer, MAXBUF + 1);
                /* 接收對(duì)方發(fā)過(guò)來(lái)的消息,最多接收 MAXBUF 個(gè)字節(jié) */
                len = recv(sockfd, buffer, MAXBUF, 0);
                if (len > 0)
                    printf
                        ("接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n",
                         buffer, len);
                else {
                    if (len < 0)
                        printf
                            ("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",
                             errno, strerror(errno));
                    else
                        printf("對(duì)方退出了,聊天終止!\n");
                    break;
                }
            }
            if (FD_ISSET(0, &rfds)) {
                /* 用戶按鍵了,則讀取用戶輸入的內(nèi)容發(fā)送出去 */
                bzero(buffer, MAXBUF + 1);
                fgets(buffer, MAXBUF, stdin);
                if (!strncasecmp(buffer, "quit", 4)) {
                    printf("自己請(qǐng)求終止聊天!\n");
                    break;
                }
                /* 發(fā)消息給服務(wù)器 */
                len = send(sockfd, buffer, strlen(buffer) - 1, 0);
                if (len < 0) {
                    printf
                        ("消息'%s'發(fā)送失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",
                         buffer, errno, strerror(errno));
                    break;
                } else
                    printf
                        ("消息:%s\t發(fā)送成功,共發(fā)送了%d個(gè)字節(jié)!\n",
                         buffer, len);
            }
        }
    }
    /* 關(guān)閉連接 */
    close(sockfd);
    return 0;
}
 
編譯用如下命令:
gcc -Wall async-server.c -o server
gcc -Wall async-client.c -o client
運(yùn)行用如下命令:
./server 7838 1
./client 127.0.0.1 7838

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av不卡免费在线观看| 国产很黄免费观看久久| 国产亚洲短视频| 在线免费观看日韩欧美| 国产在线麻豆精品观看| 中文在线免费一区三区高中清不卡| av电影在线不卡| 老司机精品视频导航| 一区二区成人在线| 中文字幕精品三区| 日韩欧美在线123| 欧美日韩aaaaaa| 色爱区综合激月婷婷| 成人h动漫精品一区二区| 激情小说亚洲一区| 美女视频网站黄色亚洲| 亚洲bt欧美bt精品777| 亚洲欧美日本在线| 欧美激情自拍偷拍| 日本一区二区三区在线不卡| 日韩视频123| 精品国产一区二区三区久久影院 | 成人免费在线视频观看| 2023国产一二三区日本精品2022| 欧美丰满高潮xxxx喷水动漫| 日本道色综合久久| 欧美日韩国产精品成人| 日韩三级视频在线观看| 国产精品久久久久一区二区三区| 日韩精品在线一区二区| 欧美在线观看18| 日本乱人伦aⅴ精品| 色八戒一区二区三区| 精品国产乱码久久久久久牛牛 | 9l国产精品久久久久麻豆| 51午夜精品国产| 一区二区激情视频| jlzzjlzz亚洲日本少妇| 色偷偷久久人人79超碰人人澡 | 中文字幕日韩精品一区| 国产日韩欧美a| 国产午夜精品美女毛片视频| 99久久久久久| 91在线视频免费观看| 国产精品99久久久| jiyouzz国产精品久久| 91麻豆精品国产91久久久| 在线综合亚洲欧美在线视频| 亚洲精品美腿丝袜| 日本中文字幕一区| 日韩欧美国产电影| 国内久久精品视频| 最近日韩中文字幕| 国产人妖乱国产精品人妖| 亚洲人成电影网站色mp4| 亚洲欧美一区二区不卡| 亚洲国产裸拍裸体视频在线观看乱了 | 国产午夜精品在线观看| 一区二区三区欧美久久| 久久精品国产第一区二区三区| 成人一级片网址| 911精品产国品一二三产区| 欧美高清在线一区| 免费视频最近日韩| 色综合婷婷久久| 国产色一区二区| 蜜桃视频一区二区三区| 91蝌蚪porny| 久久一区二区三区四区| 午夜亚洲福利老司机| 成人免费视频播放| 日韩精品一区二区三区在线 | 亚洲柠檬福利资源导航| 精品中文字幕一区二区| 在线观看国产一区二区| 国产精品欧美久久久久无广告| 青娱乐精品视频在线| 色婷婷综合久久久久中文一区二区| 精品国产免费人成电影在线观看四季 | 成人av网站在线观看| 日韩欧美一二三区| 午夜私人影院久久久久| 成人18视频在线播放| 久久亚洲捆绑美女| 免费成人性网站| 777久久久精品| 樱桃国产成人精品视频| 99久久婷婷国产综合精品| 久久精品视频一区二区三区| 老司机午夜精品99久久| 69堂精品视频| 午夜久久久久久电影| 欧美日韩一区中文字幕| 亚洲一区在线看| 欧美亚一区二区| 亚洲婷婷国产精品电影人久久| 成人网在线免费视频| 国产欧美日韩综合| 国产电影一区二区三区| 国产三级久久久| 欧美亚洲日本一区| 亚洲免费av在线| 色偷偷一区二区三区| 一区二区三区蜜桃网| 色哟哟国产精品| 亚洲一区二区三区精品在线| 一本久久a久久免费精品不卡| 亚洲三级小视频| 欧洲精品在线观看| 一区二区三区日韩欧美| 91福利精品视频| 亚洲va天堂va国产va久| 欧美喷潮久久久xxxxx| 午夜精品影院在线观看| 国产在线播放一区三区四| 亚洲精品久久久蜜桃| 另类小说色综合网站| 日韩欧美国产一区二区在线播放| 视频一区二区不卡| 欧美一区二区成人| 日韩av不卡在线观看| 美女高潮久久久| 亚洲黄色性网站| 色妞www精品视频| 亚洲综合免费观看高清完整版在线| 国产精品视频一区二区三区不卡| 久久久久久久久久久电影| 亚洲电影激情视频网站| 在线成人av影院| 激情深爱一区二区| 久久精品在线免费观看| 99热精品国产| 日本va欧美va精品发布| 国产片一区二区三区| 色94色欧美sute亚洲13| 天天综合网 天天综合色| 久久综合九色综合欧美就去吻| 成人午夜视频在线| 亚洲欧美成aⅴ人在线观看| 3d成人动漫网站| 国产91富婆露脸刺激对白| 亚洲一区在线电影| 91精品国产免费| 国产69精品久久99不卡| 亚洲成人激情综合网| 国产视频一区二区三区在线观看| 在线视频国内自拍亚洲视频| 免费在线观看不卡| 亚洲视频免费看| 日韩欧美国产不卡| 91免费看`日韩一区二区| 美日韩一级片在线观看| 亚洲欧美日韩综合aⅴ视频| 日韩一区二区三区观看| 99精品国产视频| 久久99精品国产| 一区二区三区免费观看| 国产午夜精品在线观看| 欧美久久久久久蜜桃| 国产91在线观看丝袜| 午夜精品久久久久久久久| 欧美激情一区二区三区| 欧美一级在线观看| 一本大道久久a久久精二百| 捆绑调教一区二区三区| 亚洲在线视频网站| 中文字幕欧美三区| 精品久久一区二区| 欧美亚男人的天堂| 成人久久视频在线观看| 精品影视av免费| 午夜天堂影视香蕉久久| 亚洲猫色日本管| 国产免费久久精品| 欧美一级高清片在线观看| 日本丶国产丶欧美色综合| 成人精品免费视频| 狠狠狠色丁香婷婷综合激情| 午夜激情综合网| 亚洲激情成人在线| ㊣最新国产の精品bt伙计久久| 欧美va亚洲va香蕉在线| 欧美日韩国产成人在线91| 在线精品视频一区二区| 99re成人在线| 成人精品gif动图一区| 免费日本视频一区| 日一区二区三区| 亚洲va国产va欧美va观看| 亚洲人快播电影网| 亚洲人成网站精品片在线观看| 国产欧美一区二区精品性| 精品国产电影一区二区| 日韩一区二区三区高清免费看看| 在线看不卡av| 日本电影欧美片| 在线精品视频小说1| 色偷偷88欧美精品久久久| 91视频免费看| 91小视频免费观看|