segment fault错误

sdzg_wq 2007-06-27 10:08:25
写了一个程序,在不绑定sock中的ip的情况下,想得到recvfrom函数用来接收数据的本地IP地址(本机有多个IP地址),有两个问题请教:
(1)运行时出现segment fault错误,是哪地方出错了呢?
(2)用getsockname这种方法能得到多ip时,本地接收信息的ip地址吗?
-----------------
server.c,这是服务器端。另有一个client定时向server的指定端口5678发送数据。
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
int main()
{
int sock, pport;;
char buff[100];
socklen_t i;
char *p;
p=(char *)malloc(100*sizeof(char));
struct sockaddr_in address,ad,source;
address.sin_family=AF_INET;
address.sin_port=htons(5678);
sock=socket(AF_INET,SOCK_DGRAM,0);
bind(sock,(struct sockaddr *)&address,sizeof(address));
source.sin_family=AF_INET;
ad.sin_family=AF_INET;
i = sizeof(struct sockaddr_in);
recvfrom(sock,buff,500,0,(struct sockaddr *)&source,&i);
printf("Data recieved is:%s\n",buff);
i = sizeof(struct sockaddr_in);
if(getsockname(sock,(struct sockaddr *)&ad,&i))
{
puts("Error!");
}
printf("i is:%d\n",i);
p=inet_ntoa(ad.sin_addr.s_addr);
printf("Ip is:%s\n",p);
fclose(sock);
}
...全文
323 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wq1982718 2007-06-29
  • 打赏
  • 举报
回复
getsockname达不到你的目的。用recvmsg可以
segment fault错误是因为fclose(sock),改为close(sock)
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
這個p之前不要malloc, !!!!!
p=inet_ntoa(ad.sin_addr.s_addr);
printf("Ip is:%s\n",p);
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
,在不绑定sock中的ip的情况下
其實你已經梆定了
struct sockaddr_in address是有默認值的
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
(1)运行时出现segment fault错误,是哪地方出错了呢?

改成500
char buff[100];
recvfrom(sock,buff,500,0,(struct sockaddr *)&source,&i);

因該是這個地方, 最好單步調適看看

(2)用getsockname这种方法能得到多ip时,本地接收信息的ip地址吗?

Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
baidu這本書

Beej's Guide to Network Programming

可以幫你
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
p=inet_ntoa(*((in_addr *)&(ad.sin_addr.s_addr)));]

我記錯了應該是
p=inet_ntoa(ad.sin_add);

mymtom 2007-06-27
  • 打赏
  • 举报
回复
用GDB定位segment fault的语句。
mymtom 2007-06-27
  • 打赏
  • 举报
回复
printf("Data recieved is:%s\n",buff);
--------------------------------
不能这么写!
believe_me 2007-06-27
  • 打赏
  • 举报
回复
p=(char *)malloc(100*sizeof(char));
struct sockaddr_in address,ad,source;

这两行调换一下顺序。。。
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
p=inet_ntoa(*((in_addr *)&(ad.sin_addr.s_addr)));
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
inet_ntoa裡面的參數類型也不對

在看看資料, 上網查看它的用法把3
Arthur_ 2007-06-27
  • 打赏
  • 举报
回复
address.sin_addr.s_addr=inet_addr("255.255.255.255");

fclose(sock);==>close(sock)


斷錯誤的位子你要判斷出來, 最笨的方法就是從後面向前面注釋代碼, 直到找到出錯點
sdzg_wq 2007-06-27
  • 打赏
  • 举报
回复
非常感谢Arthur_() ,您真是好人!
Q1:我把数组改为了char buff[500];还是有segment fault错误。
Q2:我加了一句address.sin_addr.s_addr=inet_addr("0.0.0.0");把sock绑定的address的初始值设定为0.0.0.0,但是这个ip是接收不了数据的,实际的ip是否填写到address中去,是什么时候填写的呢?这个实际的ip用getsockname应该可以获得吧。

69,373

社区成员

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

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