当前位置: 技术问答>linux和unix
这个程序为什么会出现段错误呢?
来源: 互联网 发布时间:2015-05-10
本文导语: [root@wengzhong linux]# ./server.exe 段错误 [root@wengzhong linux]# #include #include #include #include #include #include #include #include #include #include #define MYPORT 4000 #define BACKLOG 10 int main() { int sockfd,new_fd; struct sockaddr_in my_addr,their_addr;...
[root@wengzhong linux]# ./server.exe
段错误
[root@wengzhong linux]#
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 4000
#define BACKLOG 10
int main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr,their_addr;
int sin_size;
//取得文件描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"socket errorn");
}
else
{ //初始话参数
my_addr.sin_family= AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
bzero(&(my_addr.sin_zero),8);
//帮定
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"bind errorn");
exit(EXIT_FAILURE);
}
//监听
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"listen errorn");
exit(EXIT_FAILURE);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,(socklen_t *)&sin_size))==-1)
{
fprintf(stderr,"accept error");
continue;
}
printf("server : got connection from %sn",inet_ntoa(their_addr.sin_addr));
if(!fork())
{
//如果是子程序发送
if(send(new_fd,"hello,word!n",15,0)==-1)
{
fprintf(stderr,"send errorn");
}
close(new_fd);
exit(0);
}
close(new_fd);
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
}
段错误
[root@wengzhong linux]#
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 4000
#define BACKLOG 10
int main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr,their_addr;
int sin_size;
//取得文件描述符
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"socket errorn");
}
else
{ //初始话参数
my_addr.sin_family= AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
bzero(&(my_addr.sin_zero),8);
//帮定
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"bind errorn");
exit(EXIT_FAILURE);
}
//监听
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"listen errorn");
exit(EXIT_FAILURE);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,(socklen_t *)&sin_size))==-1)
{
fprintf(stderr,"accept error");
continue;
}
printf("server : got connection from %sn",inet_ntoa(their_addr.sin_addr));
if(!fork())
{
//如果是子程序发送
if(send(new_fd,"hello,word!n",15,0)==-1)
{
fprintf(stderr,"send errorn");
}
close(new_fd);
exit(0);
}
close(new_fd);
while(waitpid(-1,NULL,WNOHANG)>0);
}
}
}
|
my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
使用错误
inet_addr(addr_str)
addr_str是非空IP地址字符串
INADDR_ANY == NULL所以段错误
你可以改成
my_addr.sin_addr.s_addr=inet_addr("0.0.0.0");
或
my_addr.sin_addr.s_addr= htonl(INADDR_ANY);
使用错误
inet_addr(addr_str)
addr_str是非空IP地址字符串
INADDR_ANY == NULL所以段错误
你可以改成
my_addr.sin_addr.s_addr=inet_addr("0.0.0.0");
或
my_addr.sin_addr.s_addr= htonl(INADDR_ANY);
|
草看了一下
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)改为:
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1)
第三个参数为你要创建的套接口的大小而不是通用套接口大小。
另外:bzero(&(my_addr.sin_zero),8);这句最好改为
memset(&my_addr, 0, sizeof(my_addr))并放在设置地址和端口的前面,因为有的系统对可选参数sin_len的解释不同。
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)改为:
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1)
第三个参数为你要创建的套接口的大小而不是通用套接口大小。
另外:bzero(&(my_addr.sin_zero),8);这句最好改为
memset(&my_addr, 0, sizeof(my_addr))并放在设置地址和端口的前面,因为有的系统对可选参数sin_len的解释不同。
|
同意newalbert(bebe),
另将my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
改为my_addr.sin_addr.s_addr=INADDR_ANY
另将my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
改为my_addr.sin_addr.s_addr=INADDR_ANY
|
我的程序也遇到过“段错误”。每次遇到“段错误”后,系统重启后就不能加载一些kernel模块,例如fat文件系统以及网卡驱动模块。不知道这是为什么?
并且每次遇到这个问题,我也不知道如何恢复系统,只能用最笨的办法:重装系统。当系统重启后不能加载一些kernel模块时,有没有什么好办法恢复系统?
并且每次遇到这个问题,我也不知道如何恢复系统,只能用最笨的办法:重装系统。当系统重启后不能加载一些kernel模块时,有没有什么好办法恢复系统?