大神们!!为什么我写服务器端和客户端的小程序报错段错误啊
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