资源简介
简单功能如下
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
相关资源
- Micrium.RTOS.1.0.0.pack
- ISE_14.7_license.lic
- stm32f103c8t6 4 oled.rar
- mpu6050+hmc5883L.rar
- 嵌入式图形界面MiniGUI的示例程序9例
- MP3文件ID3v2ID3v2APEv2标签读取
- 课程作业:模拟仓库管理系统
- ARM嵌入式项目实战
- 一个简单实用个人日记管理系统
- 带时间温度显示的室内灯光控制系统
- 成绩管理系统(数据结构)
- uCOS编译环境建立 BC45 TASM
- FIR低通滤波器 ccs运行环境
- stm32 用SPI 方式读写 SDHC
- 自动售货机的内部嵌入式系统
- 51单片机中使用ucos ii的优缺点
- 嵌入式实时操作系统ucos-II 第二版 源
- 基于串口设备的嵌入式Web服务器系统
- 基于LW IP的嵌入式串口服务器的设计与
- 一种嵌入式串口共享服务器的设计
- 21天学会嵌入式开发STM32.zip
- 嵌入式智能平台为城市一卡通打造智
- 研祥“EVOC”嵌入式智能平台在
- ARM7TDMI-S在嵌入式系统中的Bootloader代码
- LPC2000系列微控制器应对嵌入式需求
- 嵌入式实时操作系统μC/OS-II与eCos的
- 基于STM32的嵌入式双目图像采集系统设
- 嵌入式实时操作系统在DATU中的应用
- 嵌入式实时操作系统μC/OS-II下通用驱
- 嵌入式实时操作系统μC/OS-II在ARM上的
评论
共有 条评论