资源简介
东北大学 软件学院 linux 大作业 sk老师 85分
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “msg.h“
int main()
{
int server_sockfd;//服务器端套接字
int client_sockfd;//客户端套接字
int len;
struct sockaddr_in my_addr; //服务器网络地址结构体
struct sockaddr_in remote_addr; //客户端网络地址结构体
int sin_size;
char buf[BUFSIZ]; //数据传送的缓冲区
memset(&my_addr0sizeof(my_addr)); //数据初始化--清零
my_addr.sin_family=AF_INET; //设置为IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址
my_addr.sin_port=htons(8000); //服务器端口号
key_t key;
pid_t pid;
int msgid;
int TYPE_ME; //由getpid()来指定唯一该进程才有的mtype
struct msgbuf msg;
TYPE_ME = getpid(); //用自己的进程号作为自己接收消息的消息类型
/*
char recv[10];
int i = 0;
int gamenum;
*/
//生成消息队列的key
if((key = ftok(“./“‘s‘))==-1){
perror(“ftok error.“);
exit(0);
}
//如果服务器已创建消息队列才可以打开,客户端无权创建
if((msgid = msgget(keyMSG_Q_PERM))==-1){
printf(“[server maybe not on line...]\n“);
exit(1);
}
//实现登录操作
printf(“请输入登录用户名:“);
fgets(msg.user_nameMSG_SIZEstdin);
msg.user_name[strlen(msg.user_name)-1]=‘\0‘;
msg.mtype = MSG_TO_SERVER;
msg.subtype = 1;
msg.pid = getpid();
msgsnd(msgid&msgMSG_LEN0); //MSG_SIZE是消息正文大小
//客户端双进程实现读写操作
if((pid = fork())==-1){
perror(“fork error.“);
exit(1);
}else if(pid == 0){ //子进程负责读
while(1){
msgrcv(msgid&msgMSG_LENTYPE_ME0);
//判断接收到的消息是否为quit
if(strncmp(msg.mtext“quit“4) == 0){
printf(“[server will close in 3 seconds...]\n“);
kill(TYPE_MESIGUSR1); //若接收到服务端关闭,kill所有进程
exit(0);
}
//检测用户是否输入exit退出操作
if(strncmp(msg.mtext“exit“4) == 0){
msg.subtype = 3;
}
//写成switch方便功能扩展
switch(msg.subtype){
case 1:
printf(“[%s Login]\n“msg.user_name);
break;
case 2:
printf(“[%s]: %s“msg.user_namemsg.mtext);
break;
case 3:
printf(“[%s Logout]“msg.user_name);
break;
default :
break;
}
}
}else{ //父进程用于发送消息
msg.mtype = MSG_TO_SERVER;
msg.subtype = 2; //设为广播模式
while(1){
printf(“[%s]:\n“msg.user_name);
fgets(msg.mtextMSG_SIZEstdin);
msgsnd(msgid&msgMSG_LEN0);
//当此进程输入exit时,表示进程logout
if(strncmp(msg.mtext“exit“4)==0){
msg.subtype = 3;
msgsnd(msgid&msgMSG_LEN0);
sleep(2);
kill(pidSIGKILL);
exit(0);
}
/*
printf(“游戏开始“);
int i;
int a[100];
srand( time(NULL) ); //生成种子
for(i=0;i<100;i++)
{
a[i]=rand()%7; //生成一个1~6的随机数
}
msgsnd(msgid&msgMSG_LEN0); //发送骰子得数
*/
}
}
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3286 2017-12-27 22:21 client.c
文件 299 2017-12-26 20:58 msg.h
文件 5800 2017-12-27 22:31 server.c
----------- --------- ---------- ----- ----
9385 3
- 上一篇:基于BP神经网络模型的森林空气质量评价
- 下一篇:最新安徽县级shp文件
相关资源
- 示范了Unix和Linux下如何利用Raw Socket构
- redhat官方镜像大全
- rfid rc522 linux驱动
- 东北大学数据结构实验课设
- linux下最好用的upx加壳工具
- 东北大学数据结构课程设计
- linux下RTL8821蓝牙驱动
- 嵌入式Linux视频教程完整视频
- Red_Hat_Enterprise_Linux-7-Performance_Tuning_
- Linux C大文件的创建和读写速率
- linux基础及应用课后习题答案 .pdf
- linux fb-test-帧缓冲 两个完整源代码
- GTK+glade3设计的计算器适用于linux、w
- minigui clock时钟
- Linux命令速查手册.CHM
- 自己实现linux下ls命令 的两个选项
- linux题
- Linux环境下的网络抓包工具pcap,界面
- 最新版本linux libc库实现源码
- gtk写的贪吃蛇游戏
- grub引导文件
- linux为服务器,Windows为客户端的简单
- VmwareHorizonView6ForLinuxVDI全套解决方案所
- 学生信息管理系统项 Linux
- 操作系统接口:兼容Unix/Linux命令接口
- OpenVPN在Linux教程.pdf
- Linux 常用C函数中文版
- linux c下acc打包成RTP并在VLC上播放
- 用net-snmp的api实现trap接收,windows+li
- 基于Linux嵌入式网络视频监控系统
评论
共有 条评论