LINUX.ORG.RU

socket with function mysql


0

0

Доброго времени суток.
помогите пожалуйста разобраться с ошибкой.
вот код:
// тут сокет tcp висит на 80 порту. При запросе клиента server выводет(strout) то что клиет вводит + show tables;из mysql
//код компилируется
//#gcc -o server $(mysql_config --cflags) server.c $(mysql_config --libs)
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <mysql.h>

#define QUEUE_LENGTH 10
#define BUF_LEN 4096
#define SOCK_NAME "mysocket"
#define PORT 80

int main (void)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

char *server = "localhost";
char *user = "root";
char *password = ""; /* set me first */
char *database = "dbsend";

conn = mysql_init(NULL);
// conn = malloc(sizeof(MYSQL));

int sock, client_sock;
char * buf;
char * mes;
int count;
struct sockaddr_in saddr;

sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
fprintf (stderr, "socket() error\n");
return 1;
}

buf = (char *) malloc (BUF_LEN);
if (buf == NULL) {
fprintf (stderr, "malloc() error\n");
return 1;
}

saddr.sin_family = AF_INET;

saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

saddr.sin_port = htons (PORT);
if (bind (sock, (struct sockaddr *) &saddr,
sizeof (saddr)) == -1) {
fprintf (stderr, "bind() error\n");
return 1;
}

if (listen (sock, QUEUE_LENGTH) == -1) {
fprintf (stderr, "listen() error\n");
return 0;
}

while (1) {
client_sock = accept (sock, NULL, NULL);

if (client_sock == -1) {
fprintf (stderr, "accept() error\n");
return 1;
}

if ((count = read (client_sock,
buf, BUF_LEN-1)) == -1) {
fprintf (stderr, "read() error\n");
return 1;
}

buf[count] = '\0';
printf (">> %s\n", buf);
//in db mysql

/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
// if(!mysql_select_db(conn,database))
// {
// fprintf (stderr,"error mysql_select_db\n");
// }

printf("test \n");

/* send SQL query */
if (mysql_query(conn, "show tables")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

//res = mysql_use_result(conn);
if(!(res = mysql_store_result(conn)) && mysql_num_fields(conn))
{
fprintf(stderr, "error mysql_store_result\n");
}
/* output table name */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s \n", row[0]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
//in db end
// strcpy(mes,"message \n");
// write (client_sock, mes, strlen (mes));

close (client_sock);

// if (!strcmp (buf, "exit")) break;
}

free (buf);
close (sock);
unlink (SOCK_NAME);
return 0;
}
проблема в том что после первого конекта все работает, а если повторить то пишет большой error://не может второй раз оброботать mysql_real_connect()
[root@centos socket2]# ./server
>> GGG

test
MySQL Tables in mysql database:
MESSAGE
>> GGG

*** glibc detected *** ./t1: corrupted double-linked list: 0x08cd6570 ***
======= Backtrace: =========
/lib/libc.so.6[0xb0e4f7]
/lib/libc.so.6[0xb103bd]
/lib/libc.so.6(__libc_malloc+0x7b)[0xb123ab]
/usr/lib/mysql/libmysqlclient.so.15(my_malloc+0x2d)[0x480bdd]
/usr/lib/mysql/libmysqlclient.so.15[0x4aaf34]
/usr/lib/mysql/libmysqlclient.so.15(vio_new+0x51)[0x4ab021]
/usr/lib/mysql/libmysqlclient.so.15(mysql_real_connect+0xac5)[0x4a7f65]
./t1[0x8048c7a]
/lib/libc.so.6(__libc_start_main+0xdc)[0xabce8c]
./t1[0x8048921]
======= Memory map: ========
00110000-00123000 r-xp 00000000 fd:00 165206 /lib/libnsl-2.5.so

08048000-08049000 r-xp 00000000 fd:00 721404 /root/dev/ch25/socket2/t1
08049000-0804a00Aborted
[root@centos socket2]#
на клиенте:
[root@centos socket2]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GGG
Connection closed by foreign host.
[root@centos socket2]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GGG
Connection closed by foreign host.
[root@centos socket2]#

Заранее огромное спасибо.

Раз закрываешь соединение в цикле, значит инициализировать тоже надо в цикле. Вставь mysql_init() в while.

Chumka ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.