首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

linux c下网络编程数据传输的疑问.解决方法

2012-05-30 
linux c下网络编程数据传输的疑问...最近想关注一下底层,所以了解了一下linuxc下的网络编程,这里是写的dem

linux c下网络编程数据传输的疑问...
最近想关注一下底层,所以了解了一下linuxc下的网络编程,这里是写的demo

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include "mysql_api/mysql.h"#define PORT 1234#define BACKLOG 2#define MAXDATASIZE 1024 * 1024void process_cli(int connectfd,struct sockaddr_in client);void query_data(MYSQL *conn_ptr);void init_conn_ptr(MYSQL *conn_ptr);int main(void){    int listenfd,connectfd;    pid_t pid;    struct sockaddr_in server;    struct sockaddr_in client;    int sin_size;    if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){        perror("creating socket failed");        exit(1);    }    int opt = SO_REUSEADDR;    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));    bzero(&server,sizeof(server));    server.sin_family = AF_INET;    server.sin_port = htons(PORT);    server.sin_addr.s_addr = htonl(INADDR_ANY);    if(bind(listenfd,(struct sockaddr *) &server,sizeof(struct sockaddr)) == -1){        perror("bind error");        exit(1);    }    if(listen(listenfd,BACKLOG) == -1){        perror("listen() error\n");        exit(1);    }    sin_size = sizeof(struct sockaddr_in);    while(1)    {        if((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size)) == -1){            perror("accept() error \n");            exit(1);        }        if((pid = fork()) > 0){            close(connectfd);            continue;        }else if(pid == 0){            close(listenfd);            process_cli(connectfd,client);            exit(0);        }else{            printf("fork error \n");            exit(0);        }    }    close(listenfd);}void process_cli(int connectfd,struct sockaddr_in client){     MYSQL *conn_ptr;     char *send_message;    int num;    char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],cli_name[MAXDATASIZE];    printf("you got a connection from %s",inet_ntoa(client.sin_addr));    num = recv(connectfd,cli_name,MAXDATASIZE,0);    if(num == 0){        close(connectfd);        printf("cient disconnectd.\n");        return;    }    cli_name[num - 1] = '\0';    printf("client's name is %s.\n",cli_name);    while((num = recv(connectfd,recvbuf,MAXDATASIZE,0)) > 0){        recvbuf[num] = '\0';        printf("received client (%s) message:%s",cli_name,recvbuf);        int i;        for(i = 0;i<num -1; i++){            sendbuf[i] = recvbuf[num - i -2];        }        sendbuf[num - 1] = '0';        init_conn_ptr(conn_ptr);        send_message = query_data(conn_ptr);        send(connectfd,sendbuf,strlen(send_message),0);    }    close(connectfd);}char *query_data(MYSQL *conn_ptr){        char * char_buf = (char *)malloc(1024 * 1024 * sizeof(char));        MYSQL_RES *results;        MYSQL_ROW record;        int num_fields;        mysql_query(conn_ptr,"SELECT * FROM CUS_CUSTOMER_TBL ORDER BY CUS_ID DESC LIMIT 10");        results = mysql_store_result(conn_ptr);        if(results == NULL){                printf("result is null ");                exit(1);        }        num_fields = mysql_num_fields(results);        while((record = mysql_fetch_row(results))){                for(int i=0;i<num_fields;i++){                        strcat(char_buf,record[i] == NULL ? "NULL" : record[i]);                        strcat(char_buf,"|~");                }        }        mysql_free_result(results);        return char_buf;}void init_conn_ptr(MYSQL *conn_ptr){    conn_ptr = mysql_init(NULL);    if(!conn_ptr){        fprintf(stderr,"mysql_init failed \n");        return EXIT_FAILURE;    }    conn_ptr = mysql_real_connect(conn_ptr,"127.0.0.1","S","S","s",3306,NULL,0);} 



问题在与这里
send(connectfd,sendbuf,strlen(send_message),0);
这里只能写入一个*char
能发送其他的数据?
还有一个疑问,如果我想传送一个对象应该怎么办,比如用java客户端去读取?
比如像memcached那样?他是如何实现把对象存入,然后取出的?
对与c语言来说,如果写socket服务端,通常的实现方式是什么?

[解决办法]
发送时候将对象序列化,recieve后再反序列化?
猜测,mark 等高手。。。
[解决办法]
对象的话可以这样:
struct Student
{
char name[16];
int age;
int grade;
};

首先把结果放在一个buffer里面:
char buffer[128] = {0};
char *p = buffer;
memcpy(p, name, 16);
p += 16;
*(int*)p = age;
p += sizeof(int);
*(int*)p = grade;
这样你就可以发送buffer了, 当然取出来的话,就是上面相反的过程了:
char *p = buffer;
struct Student s;
memcpy(s.name, p, 16);
p += 16;
s.age = *(int*)p;
p += sizeof(int);
s.grade = *(int*)p;
大致就这样吧, 可能上面有写的不对的地方。。。
[解决办法]
悲哀了. 

楼主原来用什么语言的? 序列化是语言支持的, 不是memcached支持的.

再者, 看楼主的描述, 很明显对C语言一窍不通.

热点排行