急急急!!!tcp服务器写完程序编译时出现Segmentation fault (core dumped)

wangqi_cainiao 2017-07-28 10:17:42
#include <stdio.h>
#include <arpa/inet.h> //inet_addr htons
#include <sys/types.h>
#include <sys/socket.h> //scoket bind listen accept connect
#include <netinet/in.h> //sockaddr_in
#include <stdlib.h> //exit
#include <unistd.h> //close
#include <string.h> //strcat
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <termios.h>
#include <sys/select.h>
#include <netdb.h>
#include <pthread.h>
#include <errno.h>
#include <time.h>



#define N 128
#define errlog(errmsg) do{perror(errmsg);\
printf("%s-->%s-->%d\n", __FILE__, __func__, __LINE__);\
exit(1);\
}while(0)

struct timeval timeout;

/*设置串口参数*/
int init_tty(int fd)
{
struct termios termios_rfid;

bzero(&termios_rfid, sizeof(termios_rfid));//清空结构体

cfmakeraw(&termios_rfid);//设置终端属性,激活选项

cfsetispeed(&termios_rfid, B9600);//输入波特率
cfsetospeed(&termios_rfid, B9600);//输出波特率

termios_rfid.c_cflag |= CLOCAL | CREAD;//本地连接和接收使能

termios_rfid.c_cflag &= ~CSIZE;//清空数据位
termios_rfid.c_cflag |= CS8;//数据位为8位

termios_rfid.c_cflag &= ~PARENB;//无奇偶校验

termios_rfid.c_cflag &= ~CSTOPB;//一位停止位

tcflush(fd,TCIFLUSH);

termios_rfid.c_cc[VTIME] = 10;//设置等待时间
termios_rfid.c_cc[VMIN] = 1;

tcflush(fd, TCIFLUSH);//清空输入缓冲区

if(tcsetattr(fd, TCSANOW, &termios_rfid))//激活串口设置
return 0;

return 1;
}

void handler(int sig)
{
wait(NULL);
}


int main(int argc, const char *argv[])
{
int sockfd, acceptfd,fd;
struct sockaddr_in serveraddr, clientaddr;
socklen_t addrlen = sizeof(serveraddr);
char buf[N] = {};
char fanhui[N]={};
char true_message[]="$##1*<CR><LR>";
char no_message[]="$##0*<CR><LR>";
pid_t pid;
ssize_t ret;


//第一步:创建套接字
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
errlog("fail to socket");
}

serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(INADDR_ANY);
serveraddr.sin_port = htons(8234);

//第三步:将套接字域网络信息结构体绑定
if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
{
errlog("fail to bind");
}

//第四步:将套接字设置为监听状态
if(listen(sockfd, 5) < 0)
{
errlog("fail to listen");
}

//打开串口
fd = open("/dev/ttyAPP3", O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < 0)
{
printf("open failed!\n");
}

if(init_tty(fd) == -1)//初始化串口
{
printf("init_tty in failed!\n");
}

timeout.tv_sec = 1;//设置超时时间为1秒
timeout.tv_usec = 0;

//处理僵尸进程
signal(SIGCHLD, SIG_IGN);


while(1)
{
//第五步:阻塞等待客户端的连接请求
if((acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
{
errlog("fail to accept");
}

//创建父子进程实现tcp并发服务器
if((pid = fork()) < 0)
{
errlog("fail to fork");
}
else if(pid > 0) //父进程负责连接
{
close(acceptfd);

}
else //子进程负责通信
{
close(sockfd);

while(1)
{
if((ret = recv(acceptfd,buf,N,0)) < 0)
{
errlog("fail to recv");
}
else if(ret == 0)
{
printf("NO DATA\n");
exit(1);
}
else
{
if(strncmp(buf,"quit",4) == 0)
{
exit(1);
}
else
{
printf("%s\n",buf);
if((buf[0]=='$')&&(buf[1]=='A'))
{
//对返回的信息
send(sockfd,true_message,N,0);
//将接收的信息发给串口
write(fd,buf,N);
printf("%s\n",buf);
//接收串口发回的信息
read(fd,fanhui,255);
printf("%s\n",fanhui);
//返回给客户端
send(sockfd,fanhui,N,0);
}
else
{
send(sockfd,no_message,N,0);
}
}
}
}
}

}
close(fd);
close(acceptfd);
close(sockfd);


return 0;
}
...全文
669 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Painot 2017-10-10
  • 打赏
  • 举报
回复
用gdb调试吧
ipqtjmqj 2017-07-29
  • 打赏
  • 举报
回复
访问了非法的地址,加printf调试,如果能输出,说明执行到那还没挂,慢慢把printf语句往后移
wangqi_cainiao 2017-07-28
  • 打赏
  • 举报
回复
一运行就显示段错误是为啥啊!!!

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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