1.设计服务端保存聊天记录功能
2.客户端增加一个聊天记录漫游,打开后会在服务器端记录聊天记录
3.服务端增加一个记录聊天记录进程,利用管道与数据交换进程获取聊天记录

源代码:
服务器端(echo_storeserv.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 100
void error_handling(char *message);
void read_childproc(int sig);int main(int argc, char *argv[])
{int serv_sock, clnt_sock;struct sockaddr_in serv_adr, clnt_adr;int fds[2];pid_t pid;struct sigaction act;socklen_t adr_sz;int str_len, state;char buf[BUF_SIZE];if(argc!=2) {printf("Usage : %s <port>\n", argv[0]);exit(1);}act.sa_handler=read_childproc;sigemptyset(&act.sa_mask);act.sa_flags=0;state=sigaction(SIGCHLD, &act, 0);serv_sock=socket(PF_INET, SOCK_STREAM, 0);memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);serv_adr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)error_handling("bind() error");if(listen(serv_sock, 5)==-1)error_handling("listen() error");pipe(fds);pid=fork();if(pid==0){FILE * fp=fopen("checkbox.txt", "wt");char msgbuf[BUF_SIZE];int i, len;for(i=0; i<10; i++){len=read(fds[0], msgbuf, BUF_SIZE);fwrite((void*)msgbuf, 1, len, fp);    }fclose(fp);return 0;}while(1){adr_sz=sizeof(clnt_adr);clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz);if(clnt_sock==-1)continue;elseputs("new client connected...");pid=fork();if(pid==0){close(serv_sock);while((str_len=read(clnt_sock, buf, BUF_SIZE))!=0){write(clnt_sock, buf, str_len);write(fds[1], buf, str_len);}close(clnt_sock);puts("client disconnected...");return 0;}elseclose(clnt_sock);}close(serv_sock);return 0;
}void read_childproc(int sig)
{pid_t pid;int status;pid=waitpid(-1, &status, WNOHANG);printf("removed proc id: %d \n", pid);
}
void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

客户端(echo_mpclient.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);
void read_routine(int sock, char *buf);
void write_routine(int sock, char *buf);int main(int argc, char *argv[])
{int sock;pid_t pid;char buf[BUF_SIZE];struct sockaddr_in serv_adr;if(argc!=3) {printf("Usage : %s <IP> <port>\n", argv[0]);exit(1);}sock=socket(PF_INET, SOCK_STREAM, 0);  memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=inet_addr(argv[1]);serv_adr.sin_port=htons(atoi(argv[2]));if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)error_handling("connect() error!");pid=fork();if(pid==0)write_routine(sock, buf);else read_routine(sock, buf);close(sock);return 0;
}void read_routine(int sock, char *buf)
{while(1){int str_len=read(sock, buf, BUF_SIZE);if(str_len==0)return;buf[str_len]=0;printf("Message from server: %s", buf);}
}
void write_routine(int sock, char *buf)
{while(1){fgets(buf, BUF_SIZE, stdin);if(!strcmp(buf,"q\n") || !strcmp(buf,"Q\n")){ shutdown(sock, SHUT_WR);return;}write(sock, buf, strlen(buf));}
}
void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

测试结果:
服务器端:

客户端:


checkbox:

英语语法和拼写问题请忽略

MyIM服务端聊天记录(网络编程作业)相关推荐

  1. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  2. 服务端的网络并发,详细解读网络io与线程进程的关系

    服务端的网络并发,详细解读网络io与线程进程的关系丨后端开发丨C/C++Linux服务器开发丨网络编程丨epoll的实现丨网络编程 视频讲解如下,点击观看: 服务端的网络并发,详细解读网络io与线程进 ...

  3. 【RK3399Pro学习笔记】十、ROS服务端Server的编程实现

    目录 如何实现一个服务器 C++ 编写程序 配置CMakeLists.txt 编译并运行 python 创建并编写脚本 运行 平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件 ...

  4. ROS入门-12.服务端Server的编程实现

    实现服务通讯的服务端Server的编程实现 主要给海龟发送速度指令,通过topic发,Service实现:Client发布request来控制Server是不是给海龟发指令让其动起来,Client相当 ...

  5. 客户端提示连接oracle出错,客户端登录报错:与服务端的网络连接发生异常,请您联系管理员处理...

    版本号:GS70 业务场景(如下): 异常信息(异常类型:Genersoft.Platform.Core.Error.GSPException) 异常标识:00000000-0000-0000-000 ...

  6. Java的HTTP服务端响应式编程

    传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...

  7. Java服务端NIO多线程编程库系列(一)

    Java作为一种跨平台的开发语言,被广泛地应用,对比C++来讲,不需要关心对象的释放,缓冲区的管理,使编程的细节处理上要简单了很多,但是在高负载.多线程.多任务的协作处理时,对象的频繁new,线程的频 ...

  8. 金蝶 K/3 Cloud 服务端控件编程模型

    如下图是服务端已有的控件编程模型 转载于:https://www.cnblogs.com/whlalhj/p/5184148.html

  9. weblogic多次连接后tcp服务堵塞_网络编程——服务器篇

    目录 一.客户端实现 二.单进程服务器 2.1 单进程实现 2.2 单进程非阻塞实现 2.3 TCP服务器(select版) 2.4 epoll版服务器实现 三.多进程服务器和多线程服务器 四.协程 ...

  10. TCP多进程并发服务端 Linux socket编程入门(2)

    这里很简单的使用了fork()函数,在执行了fork()以后的所有代码都会由子进程和父进程同时执行. 他们同时拥有相同的资源(两份拷贝),所以在子进程执行的过程中,子进程需要先close掉listen ...

最新文章

  1. “2016智能终端峰会新闻发布会暨移动信息化可信选型认证结果发布会” —— 在京成功召开...
  2. H5 六边形消除游戏开发
  3. 嘘!阿里程序媛上班的第一件事是...
  4. Microsoft Blazor——动态内容
  5. Oculus关于Internal Error:OVR53225466报错解决方法
  6. 《有限元分析及应用》第5章:变形体力学方程求解的试函数方法的原理
  7. Mac外接显示器默认30hz
  8. windows11,Windows10,服务器centos7安装docker,docker compose
  9. 【复】从0到1的 selenium 爬虫经历
  10. win7系统如何添加计算机,教你win7系统电脑添加邮箱怎么添加
  11. 图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】
  12. Burp Suite安装配置详解(附Java 环境安装)
  13. selenium 鼠标悬停事件
  14. 电机振动噪声(NVH)气隙磁场推导
  15. jsp + servlet 通过a 标签下载文件
  16. (直播、监控)利用javacv解析rtsp流,转换为flv流,通过前端flv.js解析播放
  17. android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
  18. Arduino循迹小车教程四----代码篇
  19. 为什么序列存在单位根是非平稳时间序列?
  20. linux编译bzip2,ARM-LINUX常用库移植------bzip2

热门文章

  1. 湿化学清洗过程中晶片污染控制方法
  2. 图像处理-相关知识点
  3. Java学习路线:day6 数组
  4. 远程访问双层嵌套Openstack云下的Windows虚机(by quqi99)
  5. Dying In The Sun~~逝去于阳光之下
  6. spider_study 1
  7. 派森诺细菌完成图标准分析轻松发文
  8. Spring 事件发布机制@EventListener源码深度解析
  9. OSPF 理论二 (赤诚善良 永远热爱)
  10. 计算机工程与应用期刊模板,计算机工程与应用 论文模板