手机版

linpop聊天软件代码

发布时间:2024-11-21   来源:未知    
字号:

linpop聊天软件代码,有注释

一 client.c ......................................................................................................................................................................................... 2

二 server.c ........................................................................................................................................................................................ 5

三 cl_sock.c ...................................................................................................................................................................................... 7

linpop聊天软件代码,有注释

一 client.c

*********************************

* Client.c *

* Function: *

* create the chat window *

*功能: *

*创建聊天窗口 *

*********************************/

#include "client.h"

#include <gtk/gtk.h>/*头文件*/

int issucceed=-1;

GtkTextBuffer *show_buffer,*input_buffer;/*定义全局变量*/

void get_ip(GtkWidget *,gpointer);

void quit_win(GtkWidget *,gpointer);/*声明函数*/

int main(int argc,char **argv)

{/*用GTK创建窗体控件变量*/

GtkWidget *window;/*定义一个窗体变量*/

GtkWidget *show_text,*input_text,*ip_text;/*定义三个文本框变量*/

GtkWidget *ip_label,*space_label;/*定义两个标签变量*/

GtkWidget *link_button,*send_button,*quit_button;/*定义三个按钮变量*/

GtkWidget *hbox,*vbox;/*定义两个窗口变量*/

GtkWidget *scrolled1,*scrolled2;/*创建两个滚动条*/

gtk_init(&argc,&argv);/*呼叫函数启动GTK*/

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*创建一个新视窗*/

gtk_window_set_title(GTK_WINDOW(window),"Free Chat -Client");/*设置窗体标题*/

gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);/*设置窗体位置*/

gtk_window_set_default_size(GTK_WINDOW(window),430,320);/*设置窗体位置*/

g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(quit_win),NULL);/*按destroy“退出”按钮*/ ip_label=gtk_label_new("IP:");/*设置IP标签为IP:*/

space_label=gtk_label_new(" ");/*设置标签*/

link_button=gtk_button_new_with_label("连接");/*设置按钮*/

send_button=gtk_button_new_with_label("发送");/*设置按钮*/

quit_button=gtk_button_new_with_label("关闭");/*设置按钮*/

ip_text=gtk_entry_new();/* 设置文本框 */

show_text=gtk_text_view_new();/* 设置文本框 */

input_text=gtk_text_view_new(); /* 设置文本框 */

gtk_entry_set_max_length(GTK_ENTRY(ip_text),15);/*设置IP输入框最大长度*/

show_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(show_text));/*获取显示文本框的缓冲区*/

input_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(input_text)); /*获取输入文本框的缓冲区*/

gtk_text_view_set_editable(GTK_TEXT_VIEW(show_text),FALSE);/*设置显示文本框不可编辑*/

scrolled1=gtk_scrolled_window_new(NULL,NULL);/*创建滚动窗口*/

scrolled2=gtk_scrolled_window_new(NULL,NULL); /*创建滚动窗口*/

gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled1),show_text);/*把文本框添加到滚动窗口*/ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled2),input_text);/*把文本框添加到滚动窗口*/ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled1),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);/*滚动条1显示方式,需要时显示*/

linpop聊天软件代码,有注释

gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled2),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); /*滚动条2显示方式,需要时显示*/

hbox=gtk_hbox_new(FALSE,2);/*创建窗口*/

vbox=gtk_vbox_new(FALSE,2); /*创建窗口*/

g_signal_connect(GTK_OBJECT(quit_button),"clicked",GTK_SIGNAL_FUNC(quit_win),NULL);/*关闭按钮调用退出函数*/ g_signal_connect(GTK_OBJECT(link_button),"clicked",GTK_SIGNAL_FUNC(get_ip),ip_text);/*点击“连接”,调用get_ip*/ gtk_box_pack_start(GTK_BOX(hbox),ip_label,FALSE,FALSE,2);/*在hbox窗口上添加IP标签*/

gtk_box_pack_start(GTK_BOX(hbox),ip_text,FALSE,FALSE,2); /*在hbox窗口上添加IP文本框*/

gtk_box_pack_start(GTK_BOX(hbox),link_button,FALSE,FALSE,2); /*在hbox窗口上添加链接按钮*/

gtk_box_pack_start(GTK_BOX(hbox),space_label,TRUE,TRUE,2); /*在hbox窗口上添加space标签*/

gtk_box_pack_start(GTK_BOX(hbox),send_button,FALSE,FALSE,2); /*在hbox窗口上添加发送按钮*/

gtk_box_pack_start(GTK_BOX(hbox),quit_button,FALSE,FALSE,2); /*在hbox窗口上添加退出按钮*/

gtk_box_pack_start(GTK_BOX(vbox),scrolled1,TRUE,TRUE,2);/*在vbox窗口上添加滚动窗口1*/

gtk_box_pack_start(GTK_BOX(vbox),scrolled2,FALSE,FALSE,2); /*在vbox窗口上添加滚动窗口2*/

gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,2); /*在vbox窗口上添加窗口vbox*/

gtk_container_add(GTK_CONTAINER(window),vbox); /*在窗体上添加vbox窗口*/

gtk_signal_connect(GTK_OBJECT(send_button),"clicked",GTK_SIGNAL_FUNC(send_text),NULL);

/*点击发送按钮,然后调用send_text*/

gtk_widget_show_all(window);/*显示窗体*/

gtk_main();

return 0;

}

void show_local_text(const gchar* text)/* 显示输入文本*/

{

GtkTextIter start,end;/*定义缓冲区开始和结束位置变量*/

gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);/*获得缓冲区开始和结束位置的Iter*/ gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"我说:\n",8);/*插入文本到缓冲区*/

gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,text,strlen(text));/*插入文本到缓冲区*/

gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);/*插入文本到缓冲区

}

void clean_send_text()/*清除输入区的内容*/

{

GtkTextIter start,end; /*定义缓冲区开始和结束位置变量*/

gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer),&start,&end);/*获得缓冲区开始和结束位置的Iter*/ gtk_text_buffer_delete(GTK_TEXT_BUFFER(input_buffer),&start,&end);/*删除缓冲区的内容*/

}

void send_text()/* 获得输入文本,并将其发送*/

{

GtkTextIter start,end; /*定义缓冲区开始和结束位置变量*/

gchar *text;/*定义文本指针*/

if(issucceed==-1){ /* 没有创建一个套接字*/

show_err("未建立链接...\n");

}

else/*创建成功,发送消息*/

{

text=(gchar *)malloc(MAXSIZE);/*为输入区的文本申请内存空间*/

gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer),&start,&end); /*获得缓冲区开始和结束位置的Iter*/ text=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(input_buffer),&start,&end,FALSE ;/*获得文本框缓冲区的文本*/

linpop聊天软件代码,有注释

if(strcmp(text,"")!=0)/*如果输入的文本不为空*/

{

send_func(text);/*发送文本*/

clean_send_text();./*清空输入区的内容*/

show_local_text(text);/*显示输入的文本*/

}

else /*如果输入的文本为空*/

show_err("消息不能为空...\n");

free(text);/*释放文本占用的内存*/

}

}

void show_err(char *err)/*如“没有输入”,“没有创造sockt”的错误*/

{

GtkTextIter start,end; /*定义缓冲区开始和结束位置变量*/

gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);/*获得缓冲区开始和结束位置的Iter*/ gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,err,strlen(err));/*插入到缓冲区*/

}

void get_ip(GtkWidget *button,gpointer ip_text)/* 获得IP地址和创建socket*/

{

gchar *serv_ip;/*定义一个IP地址的指针*/

serv_ip=(gchar *)gtk_entry_get_text(GTK_ENTRY((GtkWidget *)ip_text));/*创建IP地址*/

build_socket(serv_ip);/*为IP地址创建一个套接字*/

issucceed=0;

}

}

void show_remote_text(char rcvd_mess[])/*显示收到的消息*/

{

GtkTextIter start,end; /*定义缓冲区开始和结束位置变量*/

gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);/*获得缓冲区开始和结束位置的Iter*/ gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"他说:\n",8);/*插入文本到缓冲区*/

gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,rcvd_mess,strlen(rcvd_mess)-1);/*插入文本到缓冲区*/ gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);/*插入换行到缓冲区

}

void quit_win(GtkWidget *window,gpointer data)/* quit 退出*/

{

gtk_main_quit();

}

linpop聊天软件代码,有注释

二 server.c

/*************************************************

* server.c *

* Function: *

* receive message from client and print it *

* send message to client *

*功能: *

*接收来自客户端的信息,并打印出来 *

*发送消息到客户端 *

*************************************************/

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <semaphore.h>

#include <unistd.h>

#include <pthread.h>

#include <arpa/inet.h>

#define PORT 8888

#define MAXSIZE 1024

int sockfd;

struct sockaddr_in saddr,caddr;

socklen_t len=sizeof(caddr);

int main(int argc,char **argv)

{

pthread_ t recv_thread;/*定义一个线程变量*/

pthread_attr_t thread_attr;/*定义线程的属性结构*/

pthread_attr_init(&thread_attr);/* 初始化属性值,设为默认值*/

sockfd=socket(AF_INET,SOCK_DGRAM,0);/*创建一个套接字*/

bzero(&saddr,sizeof(struct sockaddr));/*给套接字清零*/

saddr.sin_family=AF_INET;/*设置套接字的协议族*/

saddr.sin_addr.s_addr=htonl(INADDR_ANY);/*绑定IP*/

saddr.sin_port=htons(PORT);/*指明端口号*/

bind(sockfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr_in));/*调用bind给服务端绑定一个IP地址和一个特定端口号*/ pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);/*设置线程分离状态,不要等待返回的子线程 pthread_create(&recv_thread,&thread_attr,recv_func,NULL); /*创建一个线程来调用接收函数*/

(void)pthread_attr_destroy(&thread_attr); /*属性用完后进行回收*/

send_func();/* 调用send_func*/

return 0;

}

void *recv_func(void *arg)/* 接收函数*/

{

linpop聊天软件代码,有注释

char recv_text[MAXSIZE];/*定义要接收的文本变量*/

while(1)/* 接受客户的信息并获得地址信息*/

{

recvfrom(sockfd,recv_text,sizeof(recv_text),0,(struct sockaddr*)&caddr,&len);/*阻塞直到收到客户端发的消息*/ printf("%s: %s \n",inet_ntoa(*(struct in_addr*)&caddr.sin_addr),recv_text);/*打印输出*/

}

}

void send_func()/* 发送功能,发送信息到客户端*/

{

char send_text[MAXSIZE];/*定义要发送的文本变量*/

while(1)

{

bzero(send_text,MAXSIZE);/*把发送的文本清零*/

fgets(send_text,MAXSIZE,stdin); /*从发送的文本中读一个字符串到字符数组stdin中*/

if(strlen(send_text)==1)/* 如果没有文字,请继续*/

continue;

sendto(sockfd,send_text,strlen(send_text),0,(struct sockaddr*)&caddr,len); /* 发送消息*/

}

}

linpop聊天软件代码,有注释

三 cl_sock.c

/************************************************

* cl_sock.c *

* function: *

* create a socket *

* create a new thread,for receive function *

* send message *

*功能: *

*创建一个socket *

*创建一个新线程,用于接收功能 *

*发送消息 *

************************************************/

#include "client.h"

int sockfd;

struct sockaddr_in saddr;

int build_socket(const char *serv_ip)

{

pthread_t recv_thread; /*定义一个线程变量*/

pthread_attr_t thread_attr; /*定义线程的属性结构*/

pthread_attr_init(&thread_attr); /* 初始化属性值,设为默认值*/

sockfd=socket(AF_INET,SOCK_DGRAM,0); /*创建一个套接字*/

bzero(&saddr,sizeof(saddr)); /*给套接字清零*/

saddr.sin_family=AF_INET; /*设置套接字的协议族*/

saddr.sin_port=htons(PORT); /*指明端口号*/

inet_pton(AF_INET,serv_ip,&saddr.sin_addr);/* 转换字符串到网络地址*/

pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED); /*设置线程分离状态,不要等待返回的子线程

pthread_create(&recv_thread,&thread_attr,&recv_func,NULL); /*创建一个线程来调用接收函数*/

(void)pthread_attr_destroy(&thread_attr); /*属性用完后进行回收*/

return 0;

}

void send_func(const char *text) /*发送功能*/

{

socklen_t len=sizeof(saddr);

sendto(sockfd,text,MAXSIZE,0,(const struct sockaddr*)&saddr,len);/*发送消息*/

}

void *recv_func(void *arg) /*一个新线程,接收消息*/

{

char rcvd_mess[MAXSIZE];

while(1)

{

bzero(rcvd_mess,MAXSIZE);

recvfrom(sockfd,rcvd_mess,MAXSIZE,0,NULL,NULL) /*阻塞直到收到客户端发的消息

show_remote_text(rcvd_mess);

}

}

linpop聊天软件代码.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)