最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語(yǔ)言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(改進(jìn)版)

 更新時(shí)間:2014年01月30日 22:14:10   作者:  
這篇文章主要介紹了c語(yǔ)言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟的改進(jìn)說(shuō)明,需要的朋友可以參考下

server.c

復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/errno.h>

#define PORT 4444
#define BACKLOG 5
#define MAX_FD 256

void setnonblocking(int);

int main(int argc, char *argv[]) {
    int sock_fd, new_fd, new_fd2, epfd, nfds;
    struct sockaddr_in server_addr, client_addr;
    int sin_size;
    int nbytes;
    int on = 1;
    char buffer[1024];
    struct epoll_event ev, events[20];

    epfd = epoll_create(MAX_FD);

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

    setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    setnonblocking(sock_fd);

    ev.data.fd  = sock_fd;
    ev.events   = EPOLLIN | EPOLLET;
    epoll_ctl(epfd, EPOLL_CTL_ADD, sock_fd, &ev);

    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family      = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port        = htons(PORT);

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

    if (listen(sock_fd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }

    printf("Server start... \n");

    sin_size = sizeof(struct sockaddr_in);

    int i;

    while (1) {
        nfds = epoll_wait(epfd, events, 20, 500);
        for (i = 0; i < nfds; i++) {
            if (events[i].data.fd == sock_fd) {
                if ((new_fd = accept(sock_fd, (struct sockaddr *)(&client_addr), &sin_size)) == -1) {
                    perror("accept");
                    exit(1);
                }
                printf("Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
                setnonblocking(new_fd);
                ev.data.fd = new_fd;
                ev.events = EPOLLIN | EPOLLET;
                epoll_ctl(epfd, EPOLL_CTL_ADD, new_fd, &ev);

            } else if (events[i].events & EPOLLIN) {
                if ((new_fd2 = events[i].data.fd) < 0) continue;
                if ((nbytes = read(new_fd2, buffer, 1024)) == -1) {
                    perror("read");
                    exit(1);
                } else if (nbytes == 0) {
                    close(new_fd2);
                    events[i].data.fd = -1;
                }
                printf("Server read from %s\n", inet_ntoa(client_addr.sin_addr));
                ev.data.fd = new_fd2;
                ev.events = EPOLLOUT | EPOLLET;
                epoll_ctl(epfd, EPOLL_CTL_MOD, new_fd2, &ev);

            } else if (events[i].events & EPOLLOUT) {
                new_fd2 = events[i].data.fd;
                write(new_fd2, "Server Received", 16);
                ev.data.fd = new_fd2;
                ev.events = EPOLLIN | EPOLLET;
                epoll_ctl(epfd, EPOLL_CTL_MOD, new_fd2, &ev);
            }
        }
    }

    return 0;
}

void setnonblocking(int fd) {
    int opts;
    if ((opts = fcntl(fd, F_GETFL)) < 0) {
        perror("fcntl(fd, F_GETFL");
        exit(1);
    }

    opts = opts | O_NONBLOCK;
    if (fcntl(fd, F_SETFL, opts) < 0) {
        perror("fcntl(fd, F_SETFL, opts");
        exit(1);
    }
}

client.c

復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 4444

int main(int argc, char *argv[]) {
    int sock_fd;
    struct sockaddr_in server_addr;
    struct hostent *host;
    char buffer[1024];

    if (argc < 2) {
        perror("Need hostname");
        exit(1);
    }

    if ((host = gethostbyname(argv[1])) == NULL) {
        perror("gethostbyname");
        exit(1);
    }

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

    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family  = AF_INET;
    server_addr.sin_port    = htons(PORT);
    server_addr.sin_addr    = *((struct in_addr *)host->h_addr);

    if (connect(sock_fd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1) {
        perror("connect");
        exit(1);
    }

    while (1) {
        printf("Please input something:\n");
        fgets(buffer, 1024, stdin);
        write(sock_fd, buffer, strlen(buffer));
        read(sock_fd, buffer, 1024);
        printf("From server: %s\n", buffer);
    }
    close(sock_fd);

    return 0;
}

相關(guān)文章

  • 在Vitis?IDE中如何使用第三方庫(kù)?libtiff?保存?tiff?文件

    在Vitis?IDE中如何使用第三方庫(kù)?libtiff?保存?tiff?文件

    這篇文章主要介紹了在Vitis?IDE中如何使用第三方庫(kù)?libtiff?保存?tiff?文件,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • websocket++簡(jiǎn)單使用及實(shí)例分析

    websocket++簡(jiǎn)單使用及實(shí)例分析

    下面小編就為大家?guī)?lái)一篇websocket++簡(jiǎn)單使用及實(shí)例分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • C++之Qt5雙緩沖機(jī)制案例教程

    C++之Qt5雙緩沖機(jī)制案例教程

    這篇文章主要介紹了C++之Qt5雙緩沖機(jī)制案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?OpenMP簡(jiǎn)單介紹

    C++?OpenMP簡(jiǎn)單介紹

    這篇文章主要介紹了C++?OpenMP簡(jiǎn)介,OpenMP?還支持自定義數(shù)據(jù)類型的歸約操作,需要通過(guò)omp?declare?reduction指令來(lái)聲明自定義操作符和數(shù)據(jù)類型的歸約方式,感興趣的朋友一起看看吧
    2023-05-05
  • C++中套接字庫(kù)sockpp的使用詳解

    C++中套接字庫(kù)sockpp的使用詳解

    sockpp是一個(gè)開(kāi)源、簡(jiǎn)單、現(xiàn)代的C++套接字庫(kù),這篇文章主要為大家詳細(xì)介紹一下套接字庫(kù)sockpp的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-11-11
  • 關(guān)于C++中引用和指針的區(qū)別詳解

    關(guān)于C++中引用和指針的區(qū)別詳解

    這篇文章主要介紹了關(guān)于C++中引用和指針的區(qū)別詳解,
    2023-07-07
  • Qt界面美化之自定義qss樣式表的詳細(xì)步驟

    Qt界面美化之自定義qss樣式表的詳細(xì)步驟

    很多人應(yīng)該和我一樣,想做界面才接觸的Qt,結(jié)果就是做不出來(lái)華麗的界面,下面這篇文章主要給大家介紹了關(guān)于Qt界面美化之自定義qss樣式表的詳細(xì)步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C語(yǔ)言棧之順序棧

    C語(yǔ)言棧之順序棧

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的順序棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    本文主要介紹了C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在 C++ 中,可以通過(guò)多種方式實(shí)現(xiàn)數(shù)組的輪轉(zhuǎn)操作,以下是幾種常見(jiàn)的實(shí)現(xiàn)方法及其對(duì)應(yīng)的代碼示例,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

夏河县| 桐庐县| 和政县| 蒲城县| 连平县| 房山区| 明水县| 金坛市| 澜沧| 怀来县| 龙泉市| 泰兴市| 长乐市| 阿拉善右旗| 梨树县| 图木舒克市| 潞城市| 麻江县| 山东省| 临海市| 大名县| 贺州市| 清水县| 重庆市| 金寨县| 浪卡子县| 汶川县| 丰宁| 芦山县| 石家庄市| 资溪县| 板桥市| 尤溪县| 恩施市| 增城市| 鄂伦春自治旗| 二手房| 满城县| 武功县| 汽车| 白水县|