zoukankan      html  css  js  c++  java
  • 随手写了一个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;
    }

  • 相关阅读:
    【转】大数据求职者说
    【转】大数据东西辣么多,我该如何给自己一个清晰的定位呢?
    【转】大数据工程师需要学习哪些?
    【English】 Re-pick up English for learning big data (not updated regularly)
    【spark】spark应用(分布式估算圆周率+基于Spark MLlib的贷款风险预测)
    【idea】scala&sbt+idea+spark使用过程中问题汇总(不定期更新)
    【idea】scala&sbt+idea安装配置与测试
    spring boot热部署
    网段判断
    【转】python测试框架--doctest
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253643.html
Copyright © 2011-2022 走看看