MyIM服务端聊天记录(网络编程作业)
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服务端聊天记录(网络编程作业)相关推荐
- java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端
//郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...
- 服务端的网络并发,详细解读网络io与线程进程的关系
服务端的网络并发,详细解读网络io与线程进程的关系丨后端开发丨C/C++Linux服务器开发丨网络编程丨epoll的实现丨网络编程 视频讲解如下,点击观看: 服务端的网络并发,详细解读网络io与线程进 ...
- 【RK3399Pro学习笔记】十、ROS服务端Server的编程实现
目录 如何实现一个服务器 C++ 编写程序 配置CMakeLists.txt 编译并运行 python 创建并编写脚本 运行 平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件 ...
- ROS入门-12.服务端Server的编程实现
实现服务通讯的服务端Server的编程实现 主要给海龟发送速度指令,通过topic发,Service实现:Client发布request来控制Server是不是给海龟发指令让其动起来,Client相当 ...
- 客户端提示连接oracle出错,客户端登录报错:与服务端的网络连接发生异常,请您联系管理员处理...
版本号:GS70 业务场景(如下): 异常信息(异常类型:Genersoft.Platform.Core.Error.GSPException) 异常标识:00000000-0000-0000-000 ...
- Java的HTTP服务端响应式编程
传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...
- Java服务端NIO多线程编程库系列(一)
Java作为一种跨平台的开发语言,被广泛地应用,对比C++来讲,不需要关心对象的释放,缓冲区的管理,使编程的细节处理上要简单了很多,但是在高负载.多线程.多任务的协作处理时,对象的频繁new,线程的频 ...
- 金蝶 K/3 Cloud 服务端控件编程模型
如下图是服务端已有的控件编程模型 转载于:https://www.cnblogs.com/whlalhj/p/5184148.html
- weblogic多次连接后tcp服务堵塞_网络编程——服务器篇
目录 一.客户端实现 二.单进程服务器 2.1 单进程实现 2.2 单进程非阻塞实现 2.3 TCP服务器(select版) 2.4 epoll版服务器实现 三.多进程服务器和多线程服务器 四.协程 ...
- TCP多进程并发服务端 Linux socket编程入门(2)
这里很简单的使用了fork()函数,在执行了fork()以后的所有代码都会由子进程和父进程同时执行. 他们同时拥有相同的资源(两份拷贝),所以在子进程执行的过程中,子进程需要先close掉listen ...
最新文章
- “2016智能终端峰会新闻发布会暨移动信息化可信选型认证结果发布会” —— 在京成功召开...
- H5 六边形消除游戏开发
- 嘘!阿里程序媛上班的第一件事是...
- Microsoft Blazor——动态内容
- Oculus关于Internal Error:OVR53225466报错解决方法
- 《有限元分析及应用》第5章:变形体力学方程求解的试函数方法的原理
- Mac外接显示器默认30hz
- windows11,Windows10,服务器centos7安装docker,docker compose
- 【复】从0到1的 selenium 爬虫经历
- win7系统如何添加计算机,教你win7系统电脑添加邮箱怎么添加
- 图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】
- Burp Suite安装配置详解(附Java 环境安装)
- selenium 鼠标悬停事件
- 电机振动噪声(NVH)气隙磁场推导
- jsp + servlet 通过a 标签下载文件
- (直播、监控)利用javacv解析rtsp流,转换为flv流,通过前端flv.js解析播放
- android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
- Arduino循迹小车教程四----代码篇
- 为什么序列存在单位根是非平稳时间序列?
- linux编译bzip2,ARM-LINUX常用库移植------bzip2