#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;
}
uj5u.com熱心網友回復:
一運行就顯示段錯誤是為啥啊!!!uj5u.com熱心網友回復:
訪問了非法的地址,加printf除錯,如果能輸出,說明執行到那還沒掛,慢慢把printf陳述句往后移uj5u.com熱心網友回復:
用gdb除錯吧轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/109683.html
標籤:網絡通信
下一篇:接收快取區滿的問題
