这个程序为什么会出现段错误呢?

wengzhong 2003-11-06 08:39:42
[root@wengzhong linux]# ./server.exe
段错误
[root@wengzhong linux]#

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#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 error\n");
}
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 error\n");
exit(EXIT_FAILURE);
}
//监听
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"listen error\n");
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 %s\n",inet_ntoa(their_addr.sin_addr));
if(!fork())
{
//如果是子程序发送
if(send(new_fd,"hello,word!\n",15,0)==-1)
{
fprintf(stderr,"send error\n");
}
close(new_fd);
exit(0);
}
close(new_fd);
while(waitpid(-1,NULL,WNOHANG)>0);
}

}
}







...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
angeldai 2003-11-08
  • 打赏
  • 举报
回复
关注
angeldai 2003-11-07
  • 打赏
  • 举报
回复
我的程序也遇到过“段错误”。每次遇到“段错误”后,系统重启后就不能加载一些kernel模块,例如fat文件系统以及网卡驱动模块。不知道这是为什么?
并且每次遇到这个问题,我也不知道如何恢复系统,只能用最笨的办法:重装系统。当系统重启后不能加载一些kernel模块时,有没有什么好办法恢复系统?
blh 2003-11-07
  • 打赏
  • 举报
回复
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);
marlboro 2003-11-07
  • 打赏
  • 举报
回复
同意newalbert(bebe),
另将my_addr.sin_addr.s_addr=inet_addr(INADDR_ANY);
改为my_addr.sin_addr.s_addr=INADDR_ANY
njuhuangmy 2003-11-07
  • 打赏
  • 举报
回复
呵呵

试着如 楼上说的 都改了

发现结果 还是一样的阿

因为是无限循环

执行改成 ./test & 后, 执行生成了正确的 pid ,但是 1s 不到 还是报错
wengzhong 2003-11-07
  • 打赏
  • 举报
回复
谢谢各位:)

newalbert 2003-11-06
  • 打赏
  • 举报
回复
草看了一下
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的解释不同。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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