Linux网络编程(多人在线聊天系统)

一、首先是服务器的建立

首先是一个信号终止程序,发信号ctrl+c终止程序,而是是初始化网络通信.

创建一个描述符负责绑定服务器和监听服务器接收客户端的消息.

socket()->sockaddr_in->bind->listen(准备就绪)

开始接收客户端消息.start()函数

首先是声明一个结构体用来存储客户端的消息,利用accept()函数来创建一个新的

描述符来接收,这里有阻塞效果,也即是说连接的时候只能一个一个的连.

然后是分离线程处理这个sockfd的连接.

pthread_create(&pid,0,pthread_deal,&sockfd1);

线程主要是先做线程的分离,然后是取得它们的sockfd描述符,把这个客户端的信息

存储到一个结构体数组中.然后是调用循环发送到各个客户端的函数,来发送消息.

当接收函数recv(sockfd,buf,sizeof(buf)) == 0 的时候,表示有客户端退出,这时

就把这个在结构体数组的相应的fd置为0

#include "server.h"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int sockfd; //服务器本身的描述符
struct User u[200] = {}; //用来保存用户的信息
int size;//数组的下标,同时也是客户端的个数

void init(void) //通信准备工作
{
    printf("聊天室服务器马上启动....\n");
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("fail to socket");
        printf("服务器故障!\n");
        exit(-1);
    }
    //准备通信地址和绑定服务器
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(2222); //端口的值,转换成网络的格式
    addr.sin_addr.s_addr = inet_addr("172.16.1.21");
    if(-1 == bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)))
    {
        perror("fail to bind");
        exit(-1);
    }
    printf("bind is ok,欢迎访问!\n");
    //设置监听
    if(-1 != listen(sockfd,200))
    {
        printf("监听已经设置,一切准备就绪!\n");
    }
}

void send_msg(char *p_msg) //发送消息的函数
{
    int num = 0;
    for(num = 0;num < size;num++)
    {
        if(u[num].fd) //如果是有效的时候才发送
        {
            send(u[num].fd,p_msg,sizeof(p_msg),0);
        }
    }
}

void* pthread_deal(void* p) //线程处理函数
{
    pthread_detach(pthread_self());
    int fd2 = *(int*)p; //取得客户端的sockfd
    u[size].fd = fd2;  //放入结构体中
    char name[20] = {};
    int res = recv(fd2,name,sizeof(name),0);
    if(res > 0)
    {
        strcpy(u[size].name,name);//存放用户名
    }
    size++;
    char user[100] = {};
    sprintf(user,"%s悄悄的进来了!(*^__^*) 嘻嘻……\n",name);
    send_msg(user);
    while(1)
    {
        if(recv(fd2,name,sizeof(name),0) == 0) /*返回0表示有客户端退出*/
        {
            u[size-1].fd = 0; //把退出的客户端的结构描述符置换成0
        }
    }
}

void start(void)
{
    printf("success to start server,let‘s go!\n");
    while(1)
    {
        struct sockaddr_in client;//存储接收到的客户端的信息
        socklen_t length = sizeof(client);
        //接收客户端的信息,会有阻塞效果,sockfd1标记客户端
        int sockfd1 = accept(sockfd,(struct sockaddr*)&client,&length);
        if(sockfd1 == -1)
        {
            perror("fail to accept!");
            continue;  //继续连接
        }
        printf("%s连接上来了\n",inet_ntoa(client.sin_addr));
        /*连接成功之后,就启动线程*/
        pthread_t pid;//线程id
        pthread_create(&pid,0,pthread_deal,&sockfd1);
    }
}

void sig_exit(int signo ) //子定义信号关闭服务器函数
{
    close(sockfd);//关闭服务器端口
    printf("服务器成功关闭!\n");
    exit(0);
}
int main(void)
{
    printf("按ctrl+c关闭聊天室服务器!\n");
    signal(SIGINT,sig_exit);
    init();//初始化,服务器通信准备工作
    start();//启动服务(开始处理聊天信息)
    return 0;
}

2.客户端的编写.

Linux网络编程(多人在线聊天系统)

时间: 2024-10-11 16:44:16

Linux网络编程(多人在线聊天系统)的相关文章

网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步发布于:http://www.52im.net/thread-2067-1-1.html) 2.关于作者 翟志军,个人博客地址:https://showme.codes/,Github:https://github.com/zacker330.感谢作者的原创分享. 作者的另一篇<即时通讯安全篇(七)

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程入门

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端 和客户端相对应的程序即为服务端程序.被动的等待外面的程序来和自己通

Linux网络编程函数

转自:http://blog.csdn.net/hrbeuwhw/article/details/8050911 1.字节序函数 #include<netinet.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); 返回:网络字节序值 uint16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net32bit

Linux网络编程必看书籍推荐

首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. <计算机网络(第5版)>是国内外使用最广泛.最权威的计算机网络经典教材. 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于操作系统教学的类UNIX(的小型操作系统.而linux就是受其影响.... 第五版是2012年出的,也比较新. 作 者: (美)特南鲍姆,(美)韦瑟罗尔 著 严伟,

linux 网络编程需要学习的内容

Linux C++培训发 课程模块 Linux C++全科班课程由以下模块组成: Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令. 深入了解bash了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等. 正则表达式基础由于UNIX/Linux中很多

【LINUX网络编程】Makefile文件

<Linux网络编程>(第二版) 第2章的一些读书笔记 ↓ Makefile:在一个含有较多文件的工程中,定义一系列规则来指定编译文件的顺序,可用于管理工程. Makefile指定了工程中的哪些源文件需要编译以及如何编译.需要创建那些库文件以及如何创建这些库文件.如何最后产生我们想要的可执行文件.为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令,整个工程就完全自动编译. 首先来看一下Linux

[转] - Linux网络编程 -- 网络知识介绍

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端        和客户端相

linux网络编程基础--(转自网络)

转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接字介绍 socket机制其实就是包括socket, bind, listen, connect, accept等函数的方法,其通过指定的函数实现不同的协议(IP4,IP6等)的数据在不同层之间的传输和获取等处理.其实个人理解socket就是处于应用层和TCP/IP协议之间的一个中间层,具体的数据分析