⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 talk.c

📁 一个可以实现局域网内聊天的程序
💻 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 + -