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

c語言網(wǎng)絡編程-標準步驟(改進版)

 更新時間:2014年01月30日 22:14:10   作者:  
這篇文章主要介紹了c語言網(wǎng)絡編程-標準步驟的改進說明,需要的朋友可以參考下

server.c

復制代碼 代碼如下:

#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

復制代碼 代碼如下:

#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;
}

相關文章

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

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

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

    websocket++簡單使用及實例分析

    下面小編就為大家?guī)硪黄獁ebsocket++簡單使用及實例分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • C++之Qt5雙緩沖機制案例教程

    C++之Qt5雙緩沖機制案例教程

    這篇文章主要介紹了C++之Qt5雙緩沖機制案例教程,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++?OpenMP簡單介紹

    C++?OpenMP簡單介紹

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

    C++中套接字庫sockpp的使用詳解

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

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

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

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

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

    C語言棧之順序棧

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

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

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

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

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

最新評論

哈尔滨市| 新津县| 玉山县| 石景山区| 大竹县| 句容市| 黔南| 宜黄县| 藁城市| 宜章县| 白沙| 齐河县| 藁城市| 体育| 满洲里市| 金坛市| 长乐市| 东安县| 上杭县| 剑川县| 同心县| 镇原县| 巴南区| 河南省| 荆州市| 新宾| 新余市| 泰顺县| 伊吾县| 长沙市| 宕昌县| 吴桥县| 武鸣县| 蛟河市| 正阳县| 富源县| 子长县| 林甸县| 临安市| 温州市| 阿城市|