socket传输结构体的问题

景语 2012-03-05 04:59:04
我的代码想完成把服务器端当前目录传送到客户端的功能。
使用socket传输目录结构体。
思路是将结构体中的内容放入buf-->send传输-->recv接收-->buf数据放入目录结构体。

目录结构体定义(ANSI定义)
struct dirent {
ino_t d_ino; /* 索引号 */
off_t d_off; /* 下一个偏移量 */
unsigned short d_reclen; /* 本记录长度 */
unsigned char d_type; /* 文件类型 */
char d_name[256]; /* 文件名 */
};


服务器端主要代码
DIR *dir;
struct dirent *ptr;
char dirbuf[sizeof(*ptr)];
if((dir = opendir("./")) == NULL) {
perror("opendir\n");
exit(1);
}
while((ptr = readdir(dir)) != NULL) {
memcpy(dirbuf, &ptr, sizeof(*ptr));
if((sendBytes = send(clientfd, dirbuf, sizeof(dirbuf), 0)) == -1) {
perror("fail to send dir");
exit(1);
}
printf("name:%s\n", ptr->d_name);
}
closedir(dir);


客户端主要代码
	struct dirent *ptr;
char dirbuf[sizeof(*ptr)];
printf("current dir on server:\n");
memset(dirbuf, 0x00, sizeof(dirbuf));
while(recvBytes = recv(sockfd, dirbuf, sizeof(dirbuf), 0)) {
if(recvBytes == -1) {
printf("faile to receive dir");
exit(1);
}
memcpy(&ptr, dirbuf, sizeof(*ptr));
printf("%s\n", ptr->d_name);
}


gdb调试客户端,运行到最后一个打印语句时收到“SIGSEGV“发生Segmentation fault.
请问这是怎么回事呢?
我该过dirbuf的大小依然不能正常传输。

网上大多数传输结构体的文章都是struct mydata data形式
是不是struct dirent *ptr比较特殊呢?
...全文
230 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
景语 2012-03-06
  • 打赏
  • 举报
回复
楼上回答都没有到点子上,问题我自己解决了

客户端的定义应该为
struct dirent ptr,后门的*ptr都要改为ptr
dengcqw 2012-03-05
  • 打赏
  • 举报
回复
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小,例如

  ulimit -c 0 不产生core文件

  ulimit -c 100 设置core文件最大为100k

  ulimit -c unlimited 不限制core文件大小

景语 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈
[/Quote]

这个不太懂,没有core.数字的文件
景语 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]

意思是发送次数与接受次数不一致造成的?
赵4老师 2012-03-05
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈
赵4老师 2012-03-05
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧