• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: 其他
  • 标签: Linux  socket  TCP  

资源简介

在学习《UNIX网络编程》基础上自己动手实现TCP服务器和客户端通讯,这个版本是进阶版程序——实现多个客户端的之间的通讯。程序包含了常规网络通讯的主要步骤,除此之外还运用了select()和poll()等技术,具有一定难度,程序思路清晰,代码注释详细,适合有一定基础的人学习。代码已经无误通过测试。初学者可以休息我的入门版程序——实现单个客户端的之间的通讯,可见我的其他资源。

资源截图

代码片段和文件信息

/*服务器端程序:一个服务器和多个客户端通讯(复用)*/

#include    
#include    
#include    
#include    
#include    
#include    
#include    

#include 
#include 
#include 

#define BUFFER_SIZE 1024    

int main(int argc const char * argv[])    
{   
    int in;
    int connfdsockfd;
    struct epoll_event evevents[20]; //ev用于注册事件数组用于回传要处理的事件,告诉内核要监听什么事
    //============创建一个epoll的句柄,其中256为你epoll所支持的最大句柄数==========
    int epfd=epoll_create(256);//创建一个epoll的句柄,其中256为你epoll所支持的最大句柄数

    struct sockaddr_in client_addr;
    struct sockaddr_in server_addr;    

    server_addr.sin_family = AF_INET;    
    server_addr.sin_port = htons(11277);    
    server_addr.sin_addr.s_addr =INADDR_ANY;    
    bzero(&(server_addr.sin_zero) 8);    

    int server_sock_fd = socket(AF_INET SOCK_STREAM 0);  

    ev.data.fd=server_sock_fd; //设置与要处理的事件相关的文件描述符
    //ev.events=EPOLLIN|EPOLLOUT|EPOLLET; //设置要处理的事件类型,可读可写
ev.events=EPOLLIN|EPOLLET; //设置要处理的事件类型先监听状态,读数据然后再根据需求修改
//============注册epoll事件====================
    epoll_ctl(epfdEPOLL_CTL_ADDserver_sock_fd&ev);

    if(server_sock_fd == -1)    
    {    
        perror(“socket error“);    
        return 1;    
    }    

    char recv_msg[BUFFER_SIZE];    
    char input_msg[BUFFER_SIZE];    

    if(connect(server_sock_fd (struct sockaddr *)&server_addr sizeof(struct sockaddr_in)) == 0)    
    {    
        for(;;)
        {
//================等待epoll事件的发生=================
            int nfds=epoll_wait(epfdevents20500);
            for(i=0;i            {    
                if(events[i].events&EPOLLOUT)  //监测事件类型,若有数据发送,写socket
                {
printf(“send message to server: “);
                    bzero(input_msg BUFFER_SIZE);    
                    fgets(input_msg BUFFER_SIZE stdin);    

                    sockfd = events[i].data.fd;
                    //write(sockfd recv_msg n);
write(sockfd input_msg BUFFER_SIZE);
//send(sockfdinput_msgBUFFER_SIZE0);

                    ev.data.fd=sockfd;
                    ev.events=EPOLLIN|EPOLLET; //写完数据后,将事件类型变为读操作
                    epoll_ctl(epfdEPOLL_CTL_MODsockfd&ev); //修改后需要重新注册,这里使用EPOLL_CTL_ADD就会出错
                }   

                else if(events[i].events&EPOLLIN) //监测事件类型,若有数据到来,读socket
                {
                    bzero(recv_msg BUFFER_SIZE);
                    if((n = read(server_sock_fd recv_msg BUFFER_SIZE)) <0 )
                    {
                        printf(“read error!“);
                    } 

                    ev.data.fd=server_sock_fd;
                    ev.events=EPOLLOUT|EPOLLET; //读完数据后,将事件类型变为写操作
                    printf(“message from server: %s\n“recv_msg);
epoll_ctl(epfdEPOLL_CTL_MODserver_sock_fd&ev); //修改后需要重新注册,这里使用EPOLL_CTL_ADD就会出错
                }

            }        
        }
    }    
    return 0;    
}   

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6937  2018-06-10 17:15  server5.c

     文件       3513  2018-06-10 17:20  client5.c

----------- ---------  ---------- -----  ----

                10450                    2


评论

共有 条评论