📄 talk.c
字号:
#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <sys/time.h> /* timeval{} for select() */#include <time.h> /* timespec{} for pselect() */#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */#include <arpa/inet.h> /* inet(3) functions */#include <errno.h>#include <fcntl.h> /* for nonblocking */#include <netdb.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h> /* for S_xxx file mode constants */#include <sys/uio.h> /* for iovec{} and readv/writev */#include <unistd.h>#include <sys/wait.h>#include <sys/un.h> /* for Unix domain sockets */#include<gtk/gtk.h>#include<string.h>void * taskr(void * p);int sockfd;char sendlen[1024];//char recvline[1024];struct sockaddr_in servaddr;//struct sockaddr_in replyaddr;char message[100];GtkWidget *window;GtkWidget *entry;GtkWidget *button;GtkWidget *cancel;GtkWidget *text;GtkWidget *table;int qqwork();int winshow(int argc, char *argv[]);void qqsend (GtkObject *entry);void sendmessage(char *);int main(int argc, char *argv[]){ qqwork(); winshow(argc, argv); gtk_main(); return 0; }void qqsend(GtkObject *entry){ char *s;// char message[100]; s = gtk_entry_get_text((GtkEntry*)entry);// s = gtk_entry_get_text((GtkEntry*)entry); strcat(s,"\n"); strcpy(message, s); sendmessage(message);// gtk_text_insert((GtkText*)text,NULL,NULL,NULL,message,strlen(message));// gtk_text_insert((GtkText*)text,NULL,NULL,NULL,"\n",1); gtk_entry_set_text((GtkEntry*)entry, ""); }void quit(GtkWidget *widget, gpointer data){}gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){ g_print("delete event occurred\n"); return(TRUE);}void destroy(GtkWidget *widget, gpointer data){gtk_main_quit();}int winshow(int argc, char *argv[]){ gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window),400,300); gtk_window_set_title(GTK_WINDOW(window),"Table");// next word is connect with "cha guan bi kon"// gtk_signal_connect(GTK_OBJECT(window),"delete_event",// GTK_SIGNAL_FUNC(delete_event),NULL); gtk_signal_connect(GTK_OBJECT(window),"destroy", GTK_SIGNAL_FUNC(destroy),NULL); gtk_container_set_border_width(GTK_CONTAINER(window),10); //add a table to window table = gtk_table_new(2,2,FALSE); //create table gtk_container_add(GTK_CONTAINER(window),table); gtk_widget_show(table); //show table //add a text to table text = gtk_text_new(NULL,NULL); gtk_table_attach(GTK_TABLE(table), text, 0,2, 0,1, GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 5,5); gtk_widget_show(text); //add a entry to table entry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), entry, 0,1, 1,2, GTK_EXPAND|GTK_FILL,0,5,5); gtk_widget_show(entry); //add the ENTER to entry gtk_signal_connect(GTK_OBJECT(entry),"activate", GTK_SIGNAL_FUNC(qqsend),NULL); //add a button table button = gtk_button_new_with_label("SEND"); gtk_table_attach(GTK_TABLE(table), button, 1,2, 1,2,0,0,5,5); gtk_widget_show(button); //make the button1 clicked order gtk_signal_connect_object(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(qqsend),(GtkObject*)entry); gtk_widget_show(window); return (0);}int qqwork(){// struct sockaddr_in servaddr; struct sockaddr_in selfaddr; // char sendline[1024]; int i; const int on = 1; pthread_t tid; char *argvp = "192.168.0.255"; bzero(&selfaddr, sizeof(selfaddr)); bzero(&servaddr, sizeof(servaddr)); selfaddr.sin_family = AF_INET; selfaddr.sin_port = htons(9877); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=INADDR_ANY; servaddr.sin_port = htons(9877); /* standard daytime server */ //copy argv[1]"like 192.168.0.255" to servaddr.sin_addr); inet_pton(AF_INET, argvp, &servaddr.sin_addr); sockfd = socket(AF_INET, SOCK_DGRAM, 0); //set socket's option ,use the "S0_BROADCAST" to send message to everybody //it is named "guang bo" setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));// bind(sockfd, (struct sockaddr *)&selfaddr, sizeof(selfaddr)); //bind port if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) { perror("Bing is wrong"); exit(1); } pthread_create(&tid,NULL,taskr,NULL);}void sendmessage(char *message1){ char message2[100];// printf("%s\n",message1); strcpy(message2, message1);// printf("%s\n",message2); sendto(sockfd,message2,strlen(message2),0, (struct sockaddr*)&servaddr,sizeof(servaddr));// strcpy(message2, '0');}void * taskr(void * p){ struct sockaddr_in replyaddr; char recvline[1024]; int n,len; char ipstr[100]; char receive[2048]; while(1) { len = sizeof(replyaddr); n = recvfrom(sockfd,recvline,1024,0,(struct sockaddr *)&replyaddr,&len); recvline[n] = 0; sprintf(receive,"[%s:%d]%s\n",inet_ntop(AF_INET, (struct sockaddr*)&replyaddr.sin_addr,ipstr,100), ntohs(replyaddr.sin_port),recvline);// gtk_text_freeze((GtkText*)text); gtk_text_insert((GtkText*)text,NULL,NULL,NULL,receive, strlen(receive));// gtk_widget_show(text);// gtk_widget_show(window);// gtk_text_thaw((GtkText*)text); // printf("[%s:%d]%s\n",inet_ntop(AF_INET,// (struct sockaddr*)&replyaddr.sin_addr,ipstr,100),// ntohs(replyaddr.sin_port),recvline); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -