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语言一窍不通.