segment fault错误
写了一个程序,在不绑定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);
}
[解决办法]
p=(char *)malloc(100*sizeof(char));
struct sockaddr_in address,ad,source;
这两行调换一下顺序。。。
[解决办法]
printf( "Data recieved is:%s\n ",buff);
--------------------------------
不能这么写!
[解决办法]
baidu這本書
Beej 's Guide to Network Programming
可以幫你
[解决办法]
getsockname达不到你的目的。用recvmsg可以
segment fault错误是因为fclose(sock),改为close(sock)