资源简介
简单功能如下
1. 服务器端接收用户信息,处理后转发给其他用户,如有用户登录或退出,服务器通知所有人;
2. 群聊:用户发送的信息所有人都可以接收,接收的信息前面显示发送者的昵称和发送时间;
3. 私聊:可以选定用户发送信息,其他用户看不到,该用户也使用相同的方式回复私聊信息;
4. 保存和查看聊天记录,仅可查看自己保存的聊天记录,保存和读取聊天记录时需要使用文件锁; 保存和查看聊天记录,聊天记录保存在“./msgsave_昵称”文件中(“昵称”为保存者自己的昵称);
5. 服务器的出错信息打印输出到屏幕上,同时发送给系统日志(/var/log/messages)。
代码片段和文件信息
#include // 头文件
#include
#include
#include //定义数据结构sockaddr_in
#include //定义socket函数以及数据结构 Socket的英文原义是“孔”或“插座”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
GtkWidget *window; //登录窗口
GtkWidget *home; //主窗口
int clientfdb_file;
struct sockaddr_in clientaddr;
char user_name[50];
char fname[]=“/var/tmp/“;
int sem_id;
int init_sem(int sem_id int init_value){
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
union semun sem_union;
sem_union.val = init_value;
if(semctl(sem_id 0 SETVAL sem_union) == -1){
perror(“Initialize semaphore“);
return -1;
}
return 0;
}
int del_sem(int sem_id){
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
union semun sem_union;
if(semctl(sem_id 1 IPC_RMID sem_union)==-1){
perror(“Delete semaphore“);
return -1;
}
}
//P 操作函数
int sem_p(int sem_id){
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id &sem_b 1)==-1){
perror(“P operation“);
return -1;
}
return 0;
}
//V 操作函数
int sem_v(int sem_id){
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id &sem_b 1) == -1){
perror(“V operation“);
return -1;
}
return 0;
}
//处理登录
void deal_pressed(GtkWidget *button gpointer entry){
int sendbytes;
char *buff;
struct hostent *host;
char wel[]=“Welcome“;
//host = gethostbyname(“127.0.0.1“); //本地地址
host = gethostbyname(“127.0.0.1“);
buff = (char *)malloc(9);
const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
if(strlen(text)==0){
printf(“不能为空\n“); // 提示 不能为空
}
else{
if ((clientfd = socket(AF_INET SOCK_STREAM 0)) == -1)
{
perror(“fail to create socket“);
exit(1);
}
bzero(&clientaddr sizeof(clientaddr));
clientaddr.sin_family = AF_INET; //创建套接字时,用该字段指定地址家族,对于TCP/IP协议的,必须设置为AF_INET
clientaddr.sin_port = htons((uint16_t)atoi(“8787“));
clientaddr.sin_addr = *((struct in_addr *)host->h_addr);//host->h_addr 是一个 char*,需要的是 struct in_addr *。因此,我转换host->h_addr 成 struct in_addr *,这是个指针,取他的内容,即 *,然后赋给左边
if (connect(clientfd (struct sockaddr *)&clientaddr sizeof(struct sockaddr)) == -1)
{
perror(“fail to connect“);
exit(1);
}
if ((sendbytes = send(clientfd text strlen(text) 0)) == -1)
{
perror(“fail to send“);
exit(1);
}
if (recv(clientfd buff 7 0) == -1)
{
perror(“fail to recv“);
exit(1);
}
if(strcmp(buffwel)==0){
strcpy(user_nametext);
gtk_widget_destroy(window);
}else{
// 弹窗 提醒 提示 昵称重复
GtkWidget *dialog;
dialog = gtk_m
相关资源
- 算法竞赛入门经典 第2版刘汝佳+高清
- linux内核设计的艺术 图解linux操作系统
- 基于单片机的GPS定位及显示系统设计
- 2014英伟达校招笔试真题_嵌入式_软件
- 链表实现通讯录管理系统
- PowerShell-6.2.1-win-x86.zip
- 2006-2016软考嵌入式系统设计师真题及
- 基于嵌入式实时操作系统的程序设计
- pl/0编译器 语法分析
- 源程序阅读与调试课程设计报告--学生
- 谁说程序员不浪漫?!基于easyX图形库
- 编译原理课设c编译器
- 《基于VXWorks的嵌入式系统及实验》
- 基于粤嵌GEC-6818开发板的智能车库系统
- TDD测试驱动开发PDF及源码.zip
- 平衡小车之家资料.zip
- 嵌入式音频视频混合为mp4(mp4v2+faac
- 嵌入式系统设计与应用 基于ARM Cort
- 《嵌入式系统应用教程》课件及习题
- MCP3421 STM32 Driver
- ADS1100 STM32 Driver
- 嵌入式Linux驱动开发基础总结
- 一种新型基于多点预瞄的最优路径跟
- 论文研究 - 使用嵌入式固体浓度时间
- 查找射频嵌入式系统中的噪声来源
- STM32H7,喜欢STM32的嵌友可以上手了
- 《嵌入式Linux系统开发标准教程》第
- 单片机89c52与MLX90614红外的测温程序
- stm32f103AES加密 cbc模式
- 嵌入式按键设计大全含电路原理图
评论
共有 条评论