linux段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux段错误相关的知识,希望对你有一定的参考价值。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 8886
int main()

int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent * host;
int portnumber,nbytes;
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)

printf("socket error:%s\a\n",strerror(errno));
exit(1);


bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);

if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)

printf("Connect Error:%s\a\n",strerror(errno));
exit(1);

printf("please input message:");
scanf("%s",buffer);
send(sockfd,buffer,1024,0);
close(sockfd);


在执行时终端提示段出错,求大神帮忙,不胜感激

参考技术A /*************************************
文件名: server.c
linux 下socket网络编程简例 - 服务端程序
服务器端口设为 0x8888 (端口和地址可根据实际情况更改,或者使用参数传入)
服务器地址设为 192.168.1.104
作者:kikilizhm#163.com (将#换为@)
*/

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>

int main()

int sfp,nfp; /* 定义两个描述符 */
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=0x8888; /* 服务端使用端口 */

printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)

printf("socket fail ! \r\n");
return -1;

printf("socket ok !\r\n");

/* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */
s_add.sin_port=htons(portnum);
/* 使用bind进行绑定端口 */
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

printf("bind fail !\r\n");
return -1;

printf("bind ok !\r\n");
/* 开始监听相应的端口 */
if(-1 == listen(sfp,5))

printf("listen fail !\r\n");
return -1;

printf("listen ok\r\n");
char gc;

while(1)

sin_size = sizeof(struct sockaddr_in);
/* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
此处accept的第二个参数用于获取客户端的端口和地址信息。
*/
nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
if(-1 == nfp)

printf("accept fail !\r\n");
return -1;

printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

/* 这里使用write向客户端发送信息,也可以尝试使用其他函数实现 */
if(-1 == write(nfp,"hello,welcome to my server \r\n",32))

printf("write fail!\r\n");
return -1;

while((gc = getchar()) != EOF) /* 按ctrl + z 键结束,或者给定一个特殊字符,如'#',即 hile((gc = getchar()) != '#') */

write(nfp,gc,1);

printf("write ok!\r\n");
close(nfp);

close(sfp);
return 0;
参考技术B 首先 要明白一点,任何的段错误,都是内存分配有错误,在编译的时候 把 -g 加上,然后用gdb调试,看错误出现的位置,再分析……

gdb显示第26行有错误追问

26行编译未出错,也没看到有内存分配上的错误啊。。。求详解。。。。。

追答

第26行的 host 你是强制转换类型 ,而 host 你在15行定义的是一个结构体指针,而这个结构体指针你没有分配空间,指针没有具体的指向,所以在26行出现了段错误。

追问

按你说的我在bzero函数上一行加了一行host=gethostbyname(DEF_IP);
结果执行时显示connection refuse 这。。。。

追答

你的这个程序,出现connection refuse 是正常的。虽然在程序中建立了服务器,但没有监听和等待客户端连接的程序,所以会出现这种情况。另外,server 和 client 是分开写的,不能写在一个程序中……
因为服务器在监听的时候,程序会阻塞,不会向下运行,所以……

本回答被提问者采纳

以上是关于linux段错误的主要内容,如果未能解决你的问题,请参考以下文章

linux 段错误

linux c 段错误如何定位

关于Linux下的段错误

linux段错误

Linux - 段错误的分析

段错误详解