Linux socket通讯实验出现段错误 (核心已转储)

「已注销」 2019-04-20 04:13:00
服务端代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAXDATASIZE 100000
int main()
{
int sockfd,client_fd;
struct sockaddr_in my_addr;//
struct sockaddr_in remote_addr;
int sin_size;
int recvbytes;
int i;
int answer;
char *delim=",";
char *p;
char *str[3];
char buf[MAXDATASIZE];
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("error in create socket");
exit(1);
}
int ret,on;
on=1;
ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("error in bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("error in listen");
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((client_fd=accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size))==-1)
{
perror("error in accept");
continue;
}
printf("A connection from:%s\n",inet_ntoa(remote_addr.sin_addr));
if(!fork())
{

if(send(client_fd,"Server can calculate.Please enter :\n",40,0)==-1)
{
perror("error in send");
exit(1);
}

if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1)
{
perror("error in recive");
exit(1);
}

buf[recvbytes]='\0';
str[0]=strtok(buf,delim);
for(i=1;i<3;i++)
str[i]=strtok(NULL,delim);

if(strcmp("+",str[0])==0)
{
answer=atoi(str[1])+atoi(str[2]);

if(send(client_fd,&answer,sizeof(answer),0)==-1)
{
perror("error in send");
}

}
else if(strcmp("-",str[0])==0)
{
answer=atoi(str[1])-atoi(str[2]);
if(send(client_fd,&answer,sizeof(answer),0)==-1)
{
perror("error in send");
}
}
else if(strcmp("*",str[0])==0)
{
answer=atoi(str[1])*atoi(str[2]);
if(send(client_fd,&answer,sizeof(answer),0)==-1)
{
perror("error in send");
}
}
else if(strcmp("/",str[0])==0)
{
answer=atoi(str[1])/atoi(str[2]);
if(send(client_fd,&answer,sizeof(answer),0)==-1)
{
perror("error in send");
}
}
}

close(client_fd);

}
}


客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100000
int main(int argc,char *argv[])
{
int sockfd,recvbytes;//声明客户端套接字标识,接收消息标识
char buf[MAXDATASIZE];//建立消息缓冲区
struct hostent *host;
struct sockaddr_in serv_addr;//声明一个套接字
while(1){
if(argc<2)
{
fprintf(stderr,"Please enter the ip address:\n");
exit(1);
}

if((host=gethostbyname(argv[1]))==NULL)//由主机名称取得网络数据
{
herror("error in gethostbyname");//打印网络错误原因信息字符串
exit(1);
}
//代码1-------start---------创建客户端socket,将返回值赋值给sockfd,并判断是否创建成功
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("error in create socket");
exit(1);
}
//代码1--------end------------
//初始化客户端套接字结构体中的变量
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
//代码2-------start---------客户端向服务端发起一次连接,并判断是否连接成功
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("error in connect");
exit(1);
}
//代码2--------end------------
//代码3-------start---------从服务器端接收连接消息,将结果存于接收消息标识recvbytes,并是否接收成功
if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("error in recive");
exit(1);
}
//代码3--------end------------
//字符转换
buf[recvbytes]='\0';
printf("Recive:%s",buf);
scanf("%s",buf);
buf[strlen(buf)]='\0';
//代码4-------start---------客户端发送计算类型和参数,并判断是否发送成功
if(send(sockfd,buf,MAXDATASIZE,0)==-1)
{
perror("error in send");
exit(1);
}
//代码4--------end------------
//接收计算结果
int result=0;
if((recvbytes=recv(sockfd,&result,sizeof(result),0))==-1)
{
perror("error in recive");
exit(1);
}
if(buf[0]=='q') break;
printf("The answer is :%d\n",result);
close(sockfd);//关闭客户端套接字
}
}


运行服务端以及客户端之后直接报错段错误 (核心已转储)


gdb调试
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007ff1ac93fcc0 in _IO_vfprintf_internal (
s=0x7ff1accb6620 <_IO_2_1_stdout_>, format=<optimized out>,
ap=ap@entry=0x7ffcee98fa08) at vfprintf.c:1632
1632 vfprintf.c: 没有那个文件或目录.

...全文
128 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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