当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : @@@@求助@@@@---socket编程远程数据库访问---GTK编写C端界面,命令无法正常传送
帖子发表于 : 2011-05-09 10:21 

注册: 2011-05-09 9:54
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
访问数据库时每次只能输入执行一条命令,之后服务器端就显示接收不到客户端发送的命令了,另外我的GTK没编完,不知道如何使返回信息显示在图形界面,求各位大大帮忙! 主要是第一个问题! :em20


这是客户端程序:

#include <gtk-2.0/gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define BUFSIZE 8192
#define DEFAULT_PORT 5320
enum {SMD_NAME, DST_IP, DST_PORT};


struct sockaddr_in server;
unsigned long dst_ip;
int port;
int s;
int n;
char buf[BUFSIZE];
char cmd[BUFSIZE];
struct timeval tv;
fd_set readfd;

void closeApp (GtkWidget *window, gpointer data)
{
gtk_main_quit();
}


void button_clicked1 (GtkWidget *button, gpointer data)
{


const char *ip_text = gtk_entry_get_text(GTK_ENTRY((GtkWidget *) data));
dst_ip = inet_addr(ip_text);
port = DEFAULT_PORT;
if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(EXIT_FAILURE);
}
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = dst_ip;
server.sin_port = htons(port);
if(connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
{
perror("connect");
exit(EXIT_FAILURE);
}
printf("Connected to '%s'\n", inet_ntoa(server.sin_addr));
}

/*输入SQL语句*/
void button_clicked2 (GtkWidget *button, gpointer data)
{
char *cmd_text = (char *)gtk_entry_get_text((GtkEntry *)data);
sprintf(buf, "%s", cmd_text);
write(s, buf, BUFSIZE);
memset(buf, 0, sizeof(buf));

}

int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *ip_label, *cmd_label;
GtkWidget *ip_entry, *cmd_entry;
GtkWidget *connect_button, *insert_button;
GtkWidget *hbox1, *hbox2, *hbox3;
GtkWidget *vbox;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkEntryBox");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

g_signal_connect ( GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (closeApp), NULL);

ip_label = gtk_label_new("Login:");
cmd_label = gtk_label_new("Input Command:");

ip_entry = gtk_entry_new();
cmd_entry = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY (cmd_entry), TRUE);

connect_button = gtk_button_new_with_label("connect");
insert_button = gtk_button_new_with_label("insert");
g_signal_connect ( GTK_OBJECT (connect_button), "clicked", GTK_SIGNAL_FUNC (button_clicked1), ip_entry );
g_signal_connect ( GTK_OBJECT (insert_button), "clicked", GTK_SIGNAL_FUNC (button_clicked2), cmd_entry);
hbox1 = gtk_hbox_new ( TRUE, 5 );
hbox2 = gtk_hbox_new ( TRUE, 5 );
hbox3 = gtk_hbox_new ( TRUE, 5 );
vbox = gtk_vbox_new ( FALSE, 10 );

gtk_box_pack_start(GTK_BOX(hbox1), ip_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox1), ip_entry, TRUE, FALSE, 5);

gtk_box_pack_start(GTK_BOX(hbox2), cmd_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), cmd_entry, TRUE, FALSE, 5);

gtk_box_pack_start(GTK_BOX(hbox3), connect_button, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox3), insert_button, TRUE, FALSE, 5);

gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 5);

gtk_container_add(GTK_CONTAINER(window), vbox);

gtk_widget_show_all(window);
gtk_main ();

return 0;
}





这是服务器端程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>


#include <mysql/mysql.h> //new

#define BUFSIZE 8192
#define DEFAULT_PORT 5320

enum {CMD_NAME, SRC_PORT};
int execute(char *command, char *buf, int bufmax);
char Cmysql(char re[BUFSIZE]); //Cfangwen
int main(int argc, char *argv[])
{
struct sockaddr_in server;//服务器地址
struct sockaddr_in client;//客户机地址
int len;//sockaddr_in的长度
int port;//服务器端口号
int s;//接收报文用描述符
int s0;//接收连接用描述符
int cn;//接收命令的字数
int sn;//发送报文的字节数
int rn;//接收报文的字节数
char cmd1[BUFSIZE];//第一个语句命令
char cmd2[BUFSIZE];//第二个语句命令
char recv_buf[BUFSIZE];//接收缓冲区
char send_buf[BUFSIZE];//发送缓冲区
char A[BUFSIZE], temp, B[80];

//实际参数的处理(端口号)
if(argc == 2)
{
if((port = atoi(argv[SRC_PORT])) == 0)
{
struct servent *se;/*服务信息*/

if((se = getservbyname(argv[SRC_PORT], "tcp")) != NULL)
port = (int) ntohs((u_short)se->s_port);
else
{
fprintf(stderr, "getservbyname error\n");
exit(EXIT_FAILURE);
}
}
}
else
port = DEFAULT_PORT;

//使用TCP协议打开一个套接字
if((s0 = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(EXIT_FAILURE);
}

//设定服务器地址
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(port);
if(bind(s0, (struct sockaddr *)&server, sizeof(server)) < 0)
{
perror("bind");
exit(EXIT_FAILURE);
}

//开始接受建立连接请求
listen(s0, 5);

/*接收连接循环*/
while(1)
{
/*接收连接处理*/
len = sizeof(client);
if((s = accept(s0, (struct sockaddr *)&client, &len)) < 0)
{
perror("accept");
exit(EXIT_FAILURE);
}
printf("Connected From '%s'\n", inet_ntoa(client.sin_addr));

#ifdef FORK_SERVER
if(fork() != 0)
{
close(s);
continue;
}
close(s0);
#endif
/*服务器处理的主要子程序*/
while(1)
{
int i = 0; /*接收字符的计数器*/

strcpy(send_buf, "TCP>"); //sn=sprintf(send_buf,"TCP>");
send(s, send_buf, sizeof(send_buf), 0);

receive: /*流型数据的接收处理*/
if((rn = recv(s, &recv_buf[i], 1, 0)) < 0)
break;

/*以换行为单位进行接收处理*/
if(recv_buf[i] != '\n')
{
A[i] = recv_buf[i];
i++;
if(i < BUFSIZE - 1)
goto receive;
}
recv_buf[i] = '\0';
A[i] = '\0';
printf("receive '%s'\n", recv_buf);

/*接收命令的处理*/
if((cn = sscanf(recv_buf, "%s%s", cmd1, cmd2)) <= 0)
{

continue;
}
else if(cn == 2 && strcmp(cmd1, "show") == 0)
{
if(strcmp(cmd2, "route") == 0)
#ifdef _linux
sn = execute("/usr/bin/netstat -rn", send_buf, BUFSIZE);
#else
sn = execute("/bin/netstat -rn", send_buf, BUFSIZE);
#endif
else if(strcmp(cmd2, "arp") == 0)
#ifdef _linux
sn = execute("/usr/sbin/arp -an", send_buf, BUFSIZE);
#else
sn = execute("/sbin/arp -an", send_buf, BUFSIZE);
#endif
else if(strcmp(cmd2, "tcp") == 0)
#ifdef _linux
sn = execute("/usr/bin/netstat -tn", send_buf, BUFSIZE);
#else
sn = execute("/bin/netstat -tn", send_buf, BUFSIZE);
#endif
else if(strcmp(cmd2, "nic") == 0)
sn = execute("/sbin/ifconfig -a", send_buf, BUFSIZE);
else
sn = sprintf(send_buf, "parameter error '%s'\n" "show[route|arp|tcp|nic]\n", cmd2);
}
else if(cn == 1)
{

if(strcmp(cmd1, "quit") == 0)
break;
send_buf[0] = '\0'; ////????????????????????????????????????????????????????????????????????????????????????
if(strcmp(cmd1, "help") != 0)
sprintf(send_buf, "command error '%s'\n", cmd1);
strcat(send_buf, "command:\n"
"show route\n"
"show arp\n"
"show tcp\n"
"show nic\n"
"quit\n"
"help\n"
"run\n");
sn = strlen(send_buf);
}
else
Cmysql(A); /*调用C访问数据库的函数*/


if(sn == 0)
sn = sprintf(send_buf, "\n");

if(send(s, send_buf, sn, 0) < 0)
break;
printf("%s", send_buf);
}
printf("Connection closed.\n");
close(s);
}
close(s0);

return EXIT_SUCCESS;
}

/*
*int execute(char *command,char *buf,int bufmax);
*
*功能
* 执行命令,将结果存储到缓冲区中
*实际参数
* char *command; 所执行的命令
* char *buf; 存储输出结果的缓冲区
* int bufmax 缓冲区的大小
*返回值
* int 存储到缓冲区的字符数
*/
int execute(char *command, char *buf, int bufmax)
{
FILE *fp;//文件指针
int i;//输入数据的字节数
if((fp = popen(command, "r")) == NULL)
{
perror(command);
i = sprintf(buf, "server error: '%s' cannot execute.\n", command);
}
else
{
i = 0;
while((buf[i] = fgetc(fp)) != EOF && i < bufmax - 1)
i++;

pclose(fp);
}
return i;
}

/*char Cmysql(char *temp[80]
*功能 C访问数据库,直接将客户端传来的recv_buf里的内容传给mysql_query(&my_connection,A);
*将返回值交给result返回
*
*
*
*
*
*
*/
char Cmysql(char re[BUFSIZE])
{
MYSQL my_connection;
int res, j;
char result[80];//A = (char*)malloc(sizeof(char));

mysql_init(&my_connection);
if(mysql_real_connect(&my_connection, "localhost", "root", "02270227", "foo", 0, NULL, 0))
{
//printf("Connection success\n");
//printf("Please Input command\n");
//i=0;
//do{

//scanf("%c",&temp);
// temp ==>recv_buf oringinal express :A[i++]=temp
//}while(temp!='\n');
//A[i-1]='\0';


res = mysql_query(&my_connection, re);
if(!res)
{
printf("Insert %lu rows\n", (unsigned long)mysql_affected_rows(&my_connection)); //result return
}
else
{
fprintf(stderr, "Insert error %d: %s\n", mysql_errno(&my_connection),
mysql_error(&my_connection)); //result return

}

mysql_close(&my_connection);
}
else
{
fprintf(stderr, "Connection failed\n");
// result="Connection failed"; //result return
if(mysql_errno(&my_connection))
{
fprintf(stderr, "Connection error %d: %s\n", mysql_errno(&my_connection),
mysql_error(&my_connection));
//result="Connection error"; //result return
}
}
//return result;//
//return EXIT_SUCCESS;
}


页首
 用户资料  
 
2 楼 
 文章标题 : Re: @@@@求助@@@@---socket编程远程数据库访问---GTK编写C端界面,命令无法正常传送
帖子发表于 : 2011-06-17 12:51 
头像

注册: 2010-05-16 23:17
帖子: 61
送出感谢: 0 次
接收感谢: 0 次
世界好小,你是zzd吧...


_________________
伊吹风子的邻居常说:那孩子是个普通的地球人


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译