#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <gtk/gtk.h>
#include <sys/types.h> //man socket
#include <sys/socket.h>
#include <netinet/in.h> //man in.h
#include <arpa/inet.h> //man inet_addr
#include <pthread.h>
GtkWidget* entry;
int sockfd;
GtkWidget* text;
GtkTextBuffer *buffer;
int run = 1;
void on_send(GtkButton *button,gpointer user_data){
//hello
const char *msg = gtk_entry_get_text(GTK_ENTRY(entry));
char allmsg[512] = {'\0'};
sprintf(allmsg,"%s\r\n",msg);
write(sockfd,allmsg,strlen(allmsg));
gtk_entry_set_text(GTK_ENTRY(entry),"");
if(strncasecmp("quit",msg,4)==0){
run = 0;
gtk_main_quit();
}
}
void on_delete(GtkWidget *widget,GdkEvent *event,gpointer data){
char msg[32] = "quit\r\n";
write(sockfd,msg,strlen(msg));
run = 0;
gtk_main_quit();
}
void *read_net(void *p) {
int sockfd = *(int*)p;
//printf("sockfd:%d\n",sockfd);
GtkTextIter it;
while (run) {
char buf[256] = { '\0' };
read(sockfd, buf, sizeof(buf));
//printf(buf);
gtk_text_buffer_get_end_iter(buffer,&it);
gtk_text_buffer_insert(buffer,&it,buf,-1);
}
close(sockfd);
return NULL;
}
int myconnect(char *ip, int port) {
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket:");
return -1;
}
struct sockaddr_in ser_addr;
ser_addr.sin_family = PF_INET;
ser_addr.sin_addr.s_addr = inet_addr(ip);
ser_addr.sin_port = htons(port);
int ret = connect(sockfd, (struct sockaddr*) &ser_addr, 16);
if (ret < 0) {
perror("connect:");
return -1;
}
printf("connect to server!\n");
pthread_t tid;
//printf("sockfd1:%d\n",sockfd);
pthread_create(&tid,NULL,read_net,&sockfd);
sleep(1);
return 0;
}
int main(int argc,char* argv[]){
gtk_init(&argc,&argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"聊天客户端v1.0");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_icon_from_file(GTK_WINDOW(window),"images/labelimage.png",NULL);
gtk_container_set_border_width(GTK_CONTAINER(window),0);
//事件源 事件 事件处理函数(回调函数) 信号/插槽机制
g_signal_connect(window,"delete-event",G_CALLBACK(on_delete),NULL);
//添加容器控件(竖直盒子)
GtkWidget* vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
//添加文本视图控件
GtkWidget* view = gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
text = gtk_text_view_new();
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
gtk_container_add(GTK_CONTAINER(view),text);
gtk_box_pack_start(GTK_BOX(vbox),view,TRUE,TRUE,10);
//添加水平盒子
GtkWidget* hbox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,10);
//添加文本输入框
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox),entry,TRUE,TRUE,10);
//添加按钮控件
GtkWidget* btn = gtk_button_new_with_label("发 送");
g_signal_connect(btn,"clicked",G_CALLBACK(on_send),NULL);
gtk_box_pack_start(GTK_BOX(hbox),btn,FALSE,FALSE,10);
gtk_widget_show_all(window);
myconnect("127.0.0.1",2000);
gtk_main();
return 0;
#include <unistd.h>
#include <string.h>
#include <gtk/gtk.h>
#include <sys/types.h> //man socket
#include <sys/socket.h>
#include <netinet/in.h> //man in.h
#include <arpa/inet.h> //man inet_addr
#include <pthread.h>
GtkWidget* entry;
int sockfd;
GtkWidget* text;
GtkTextBuffer *buffer;
int run = 1;
void on_send(GtkButton *button,gpointer user_data){
//hello
const char *msg = gtk_entry_get_text(GTK_ENTRY(entry));
char allmsg[512] = {'\0'};
sprintf(allmsg,"%s\r\n",msg);
write(sockfd,allmsg,strlen(allmsg));
gtk_entry_set_text(GTK_ENTRY(entry),"");
if(strncasecmp("quit",msg,4)==0){
run = 0;
gtk_main_quit();
}
}
void on_delete(GtkWidget *widget,GdkEvent *event,gpointer data){
char msg[32] = "quit\r\n";
write(sockfd,msg,strlen(msg));
run = 0;
gtk_main_quit();
}
void *read_net(void *p) {
int sockfd = *(int*)p;
//printf("sockfd:%d\n",sockfd);
GtkTextIter it;
while (run) {
char buf[256] = { '\0' };
read(sockfd, buf, sizeof(buf));
//printf(buf);
gtk_text_buffer_get_end_iter(buffer,&it);
gtk_text_buffer_insert(buffer,&it,buf,-1);
}
close(sockfd);
return NULL;
}
int myconnect(char *ip, int port) {
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket:");
return -1;
}
struct sockaddr_in ser_addr;
ser_addr.sin_family = PF_INET;
ser_addr.sin_addr.s_addr = inet_addr(ip);
ser_addr.sin_port = htons(port);
int ret = connect(sockfd, (struct sockaddr*) &ser_addr, 16);
if (ret < 0) {
perror("connect:");
return -1;
}
printf("connect to server!\n");
pthread_t tid;
//printf("sockfd1:%d\n",sockfd);
pthread_create(&tid,NULL,read_net,&sockfd);
sleep(1);
return 0;
}
int main(int argc,char* argv[]){
gtk_init(&argc,&argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"聊天客户端v1.0");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_icon_from_file(GTK_WINDOW(window),"images/labelimage.png",NULL);
gtk_container_set_border_width(GTK_CONTAINER(window),0);
//事件源 事件 事件处理函数(回调函数) 信号/插槽机制
g_signal_connect(window,"delete-event",G_CALLBACK(on_delete),NULL);
//添加容器控件(竖直盒子)
GtkWidget* vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
//添加文本视图控件
GtkWidget* view = gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
text = gtk_text_view_new();
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
gtk_container_add(GTK_CONTAINER(view),text);
gtk_box_pack_start(GTK_BOX(vbox),view,TRUE,TRUE,10);
//添加水平盒子
GtkWidget* hbox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,10);
//添加文本输入框
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox),entry,TRUE,TRUE,10);
//添加按钮控件
GtkWidget* btn = gtk_button_new_with_label("发 送");
g_signal_connect(btn,"clicked",G_CALLBACK(on_send),NULL);
gtk_box_pack_start(GTK_BOX(hbox),btn,FALSE,FALSE,10);
gtk_widget_show_all(window);
myconnect("127.0.0.1",2000);
gtk_main();
return 0;
}