大神们!!为什么我写服务器端和客户端的小程序报错段错误啊

sh13661847134 2019-04-15 07:10:51
server.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <ctype.h>
#include <arpa/inet.h>

typedef struct sockaddr_in SA_I;//给IPV4具体地址的结构体起别名
typedef struct sockaddr SA;//SA是sockaddr_in的别名

int main(void){

int s_fd;/*(1)skcket的返回值*/

SA_I ser;//(2)IPV4的具体地址

SA_I cli;//(2)客户端的地址(来电显示)
int cli_len;//(客户端地址的长度)
char IP[128];//将客户端IP地址转换成字符串

int conn_fd;//(4)和客户端的连接,保存客户端发送过来的数据以便处理
int i;/*(4)数据的循环处理*/
char buf[128];/*对数据(内存)操作的长度*/


//1、创建socket,IPV4基于TCP连接
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd==-1){
perror("socket");
return -1;
}

//初始化服务器的IP地址和端口号
ser.sin_family = AF_INET;//用IPV4家族
ser.sin_port = htons(7777);//端口号,并用htons将主机字节序7777转换成网络字节序
//服务器的IP地址。
//INADDR_ANY这个宏代表本机上的所有IP地址,长整形
ser.sin_addr.s_addr = htons(INADDR_ANY);/*将主机字节序转换成网络字节序*/

//2、将服务器的IP地址和端口号绑定到s_fd,此时是通用地址的IP地址和端口号
int b=bind(s_fd,(SA *)&ser/*IP地址和端口号号*/,sizeof(SA_I)/*server地址空间的长度*/);
if(b == -1){
perror("bind");
return -1;
}

//3、监听socket
listen(s_fd,5/*最大未决连接数量*/);
//4、从未决连接队列中取出一个连接,处理连接
while(1){
//取出一个链接,如果没有未决链接,阻塞等待
conn_fd=accept(s_fd,(SA *)&cli,&cli_len);//来电显示...
if(conn_fd==-1){
perror("accept");
return -1;
}

//需要将二进制转换成字符串格式
printf("%s\n",inet_ntop(AF_INET,&cli.sin_addr,IP,128));

/*accept返回时,握手成功,从客户端都取数据,此时可以处理数据
从conn_fd里面读,客户端的数据保存在conn_fd中*/
int r = read(conn_fd,buf,128/*读的长度*/);
//对获取的数据进行处理,用toupper转换成大写
for(i=0;i<r;i++){
buf[i]=toupper(buf[i]);
//相应给客户端
write(conn_fd,buf,r);
//关闭与客户端的连接
close(conn_fd);
}
}
return 0;
}


client.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <string.h>

typedef struct sockaddr_in SA_I;//给IPV4具体地址的结构体起别名
typedef struct sockaddr SA;//SA是sockaddr_in的别名

int main(int argc,char *argv[]){

int s_fd;//socket的返回值
SA_I serv;//服务器
char *msg="this is a test\n";
char buf[128];/*对数据(内存)操作的长度*/

//1、创建socket
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
perror("socket");
return -1;
}

//初始化服务器的信息
serv.sin_family = AF_INET;//IPV4家族
serv.sin_port = htons(7777);//端口号,并用htons将主机字节序7777转换成网络字节序
//服务器的IP地址。
//因为用户知道的是服务器字符串类型的IP地址
//所以将IP地址转换成serv.sin_addr格式
//127.0.0.1代表本机IP,自己连接自己,下次改IP
inet_pton(AF_INET,argv[1],&serv.sin_addr);


//2、建立s_fd和服务器的连接
int c = connect(s_fd,(SA *)&serv/*通用地址*IP和端口号*/,sizeof(SA_I)/*通用地址的长度*/);
if(c == -1){
perror("connect");
return -1;
}

//3、向服务器发送信息
write(s_fd/*往s_fd里面写*/,msg,strlen(msg));
//3、从s_fd里获取服务器端的响应信息
int r = read(s_fd,buf,128);
//3、处理响应信息
write(1,buf,r);//将buf内的数据写r个到显示器上
//3、关闭和服务器端的连接
close(s_fd);
return 0;
}

客户端连接服务器端的时候就报错段错误QVQ
...全文
286 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LubinLew 2019-04-15
  • 打赏
  • 举报
回复
程序整体式没有大问题的,
1. htons(INADDR_ANY) 这个要改成 htonl(INADDR_ANY), 因为IPV4地址占用4个字节
2. client 运行的时候要指定服务器ip地址 例如 ./client 127.0.0.1, 如果不加地址就会产生段错误
LubinLew 2019-04-15
  • 打赏
  • 举报
回复
那你gdb一下吧
sh13661847134 2019-04-15
  • 打赏
  • 举报
回复
引用 1 楼 LubinLew的回复:
程序整体式没有大问题的,
1. htons(INADDR_ANY) 这个要改成 htonl(INADDR_ANY), 因为IPV4地址占用4个字节
2. client 运行的时候要指定服务器ip地址 例如 ./client 127.0.0.1, 如果不加地址就会产生段错误
第一个改成长整型的话我这边显示接收不到啊。。。 第二个的话 我肯定输入了IP的

23,121

社区成员

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

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