资源简介

简单功能如下 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

评论

共有 条评论