C++ string 使用的深刻教训
来源:互联网 发布:java cmd运行 编辑:程序博客网 时间:2024/06/05 14:59
//----------------------------------------------------
//AUTHOR: lanyang123456
//DATE: 2014-10-30
//---------------------------------------------------server:
/*IPCsocket AF_UNIXserver*/#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h> #include <errno.h>#include <string.h>#include <unistd.h>#include <string>#define UNIX_DOMAIN"/tmp/UNIX.domain"#define QUEUE_LEN5using namespace std;struct message {int id;string strmsg;};int main(void){ socklen_t clt_addr_len; int listen_fd; int com_fd; int ret; int i; char recv_buf[1024]; socklen_t len; struct sockaddr_un client_addr; struct sockaddr_un server_addr; struct message req; listen_fd = socket(PF_UNIX, SOCK_STREAM, 0); if(listen_fd < 0) { perror("cannot create communication socket"); return -1; } //set server addr server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, UNIX_DOMAIN, sizeof(server_addr.sun_path) - 1); unlink(UNIX_DOMAIN); //bind sockfd & addr ret = bind(listen_fd, (struct sockaddr*)&server_addr,sizeof(server_addr)); if(ret == -1) { perror("cannot bind server socket"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //listen sockfd ret = listen(listen_fd, 1); if(ret==-1) { perror("cannot listen the client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //have connect request use accept len = sizeof(client_addr); com_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len); if(com_fd < 0) { perror("cannot accept client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } //read and printf sent client info printf("-------accetpt client connect--------\n"); ret = read(com_fd, &req, sizeof(req));//req if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } printf("read client request.\n"); printf("strmsg.size() = %d\n",req.strmsg.size()); int msg_len = req.strmsg.size(); memset(recv_buf,0,1024); ret = read(com_fd, recv_buf, msg_len);//body if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return -1; } req.strmsg.append(recv_buf, msg_len); printf("Message from client : id: %d body: %s\n", req.id, req.strmsg.c_str()); close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return 0;}
client:
/*IPCsocket AF_UNIXclient*/#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <string>#define UNIX_DOMAIN "/tmp/UNIX.domain"using namespace std;struct message {int id;string strmsg;};int main(void){ int connect_fd; int ret; char msg_body[1024]; int i; static struct sockaddr_un server_addr; struct message request; //creat unix socket connect_fd=socket(AF_UNIX, SOCK_STREAM, 0); if(connect_fd<0) { perror("cannot create communication socket"); return 1; } server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, UNIX_DOMAIN); //connect server ret=connect(connect_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(ret==-1) { perror("cannot connect to the server"); close(connect_fd); return 1; } memset(msg_body, 0, 1024); strcpy(msg_body, "message from client"); request.id = 101; request.strmsg.append(msg_body, strlen(msg_body)); ret = write(connect_fd, &request, sizeof(request));//request if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(connect_fd);return -1; } ret = write(connect_fd, msg_body, sizeof(msg_body));//body if (ret <= 0) {printf("write error(%d) %s\n", errno, strerror(errno));close(connect_fd);return -1; } close(connect_fd); return 0;}<span style="font-size:14px;"></span>
$ g++ -o server server.cpp
$ g++ -o client client.cpp
./server
./client
server:
-------accetpt client connect--------
read client request.
Segmentation fault (core dumped)
分析:
从client接收string对象(假设为c),然后接收拷贝放到server端string对象(假设为s)中,server端string对象s相关地址是c对象中的地址;在server使用s对象引用地址,就存在内存越界问题(Segmentation fault)。
这是要深刻注意的!
0 0
- C++ string 使用的深刻教训
- 第一次深刻的教训
- 学习内核移植的深刻教训
- 9.18事变中国的深刻历史教训
- 这次的教训是深刻的--关于使用GetFiles()删除文件的后果!
- 深刻的教训——SQL Server关于TempDB的使用
- 教训深刻的Maudio delta66的rom以及资料!!
- 一个愚蠢的错误,一次深刻的教训
- 关于内存泄露-深刻的记忆和教训-2012.12.05
- bind:address already in use的深刻教训以及解决办法
- 对String的深刻理解
- 对String的深刻理解
- 【分享教训】关于一个字母价值2000块钱的深刻教训20150120
- setsocketopt函数使用的教训 linux c 语言
- 使用jstl c:when报500的教训
- C++string的使用
- 对String类的深刻理解
- [转]对String的深刻理解
- 如何获取整个schema的DDL ,除了表和index 其他所有对象包括权限!
- hdu 4970 Just Random(数学:推理)
- vs2010定制C++的项目模板
- 使用volley上传图片,一个参数多张图、多张图片多张图,亲测有效哦
- RHEL5.5 关于SHELL脚本的问题
- C++ string 使用的深刻教训
- 函数指针实例(函数名调用、函数指针调用 、回调函数调用)
- android tips—开机引导启动wifi设置
- 网站流量统计单位
- POJ3928
- Linux 下串口USB等设备通信编程入门(1)
- c语言指针单链表
- osX 10.10 Yosemite pod问题
- sqlldr 参数配置