• 随手写了一个linux服务端与window客户端的epoll程序,当做练习把。


    linux服务端:监听链接,处理消息

    #include <sys/socket.h>    
    #include <sys/epoll.h>    
    #include <netinet/in.h>    
    #include <arpa/inet.h>    
    #include <fcntl.h>    
    #include <unistd.h>    
    #include <stdio.h>    
    #include <errno.h>    

    #define MAX_EVENTS 500    

    int main()
    {
    int epfd = -1;
    int listensocket;
    struct sockaddr_in serveraddr;
    char buf[MAX_EVENTS][100] = {0};


    int nCount = 0;


    struct epoll_event ev, evs[MAX_EVENTS];


    listensocket = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == listensocket)
    {
    perror("socket fail ");
    return -1;
    }


    printf("listensocket:0x%x ", listensocket);


    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    serveraddr.sin_port = htons(7778);


    int bReuse = 1;
    if (-1 == setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(bReuse)))
    {
    perror("setsockopt fail ");
    return -1;
    }


    if (-1 == bind(listensocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
    {
    perror("bind fail ");
    return -1;
    }


    if (-1 == listen(listensocket, 3))
    {
    perror("listen fail ");
    return -1;
    }


    epfd = epoll_create(MAX_EVENTS);
    if (-1 == epfd)
    {
    perror("epoll_create fail ");
    return -1;
    }


    printf("epfd:0x%x ", epfd);


    ev.events = EPOLLIN;
    ev.data.fd = listensocket;
        if (-1 == epoll_ctl(epfd, EPOLL_CTL_ADD, listensocket, &ev))
    {
    perror("epoll_create fail ");
    return -1;
    }


    while (1)
    {
    int i = 0;
    struct sockaddr_in peeraddr;
    int addrlen = sizeof(peeraddr);
    int fd;
    int rcvnum = 0;
    int r = 9;


    memset(&peeraddr, 0, sizeof(peeraddr));


    //printf("waiting... ");
    nCount = epoll_wait(epfd, evs, MAX_EVENTS, -1);
    if (0 > nCount)
    {
    perror("epoll_create fail ");
    continue;
    }


    for(i = 0; i < nCount; i++)
    {
    if (evs[i].data.fd == listensocket)
    {
    fd = accept(listensocket, (struct sockaddr *)&peeraddr, &addrlen);
    printf("peeraddr %s:%d ", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));


    ev.events = EPOLLIN;
    ev.data.fd = fd;
    if (-1 == epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev))
    {
    perror("epoll_ctl listen fail ");
    return -1;
    }
    }
    else
    {
    rcvnum = recv(evs[i].data.fd, buf[i], 100, 0);
    if (0 == rcvnum)
    {
    close(evs[i].data.fd);
    continue;
    }
    buf[i][99] = 0;
    printf("recv:%s ", buf);
    memset(buf[i], 0, 100);
    }
    }
    }

    return 0;
    }


    window客户端:主要发送消息至liunx服务端:

    #include <stdio.h>   
    #include <winsock2.h> 
     
    int main(int argc, char **arg)
    {
    SOCKET fd;
    struct sockaddr_in serveraddr;
    int nCount = 0;
    int ret;


    WSADATA wsaData;
        short version = MAKEWORD(2,2);
    WSAStartup(version,&wsaData);//初始化socket


    if (argc != 2)
    {
    printf("param fail ");
    return -1;
    }

    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == fd)
    {
    perror("socket fail ");
    return -1;
    }

    printf("fd:0x%x ", fd);

    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr("172.16.192.92");
    serveraddr.sin_port = htons(7778);


    if (-1 == connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
    {
    printf("connect fail ");
    return -1;
    }


    while (1)
    {
    ret = send(fd, arg[1], strlen(arg[1]), 0);
    printf("send:%d ret:%d ", strlen(arg[1]), ret);
    if (ret < 0)
    {
    closesocket(fd);
    break;
    }
    Sleep(1000);
    }

    return 0;
    }

  • 相关阅读:
    大道至简伪代码形式读后感
    大道至简读后感
    使用类型转换生成六位验证字符,实现用户输入验证码的功能
    flex弹性布局的基本介绍
    清除浮动的方法以及为什么清除浮动
    :target伪类制作tab选项卡
    div中的内容水平垂直居中
    setTimeout和setInterval的区别以及如何写出效率高的倒计时
    margintop影响父元素定位
    关于页面中弹窗的定位问题
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253643.html
Copyright © 2020-2023  润新知