server.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define SER_PORT 8888 //服务器端口号
#define SER_IP "10.148.4.168" //服务器IP地址
int main(int argc,const char*argv[]){
//1、创建用于连接的套接字文件描述符
int sfd=socket(AF_INET,SOCK_STREAM,0);
//参数1:AF_INET表示使用的是ipv4的通信协议
//参数2:SOCK_STREAM表示使用的是TCP通信
//参数3:由于参数2指定了协议,参数3填0就行
if(sfd==-1){
perror("socket error!");
return -1;
}
printf("socket success sfd = %d\n", sfd);
//2、绑定ip地址和端口号
//2.1填充要绑定的ip地址和端口号结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET; //通信域
sin.sin_port=htons(SER_PORT); //端口号
sin.sin_addr.s_addr =inet_addr(SER_IP); //IP地址
//2.2绑定工作
//参数1:要被绑定的套接字文件描述符
//参数2:要绑定的地址信息结构体,需要进行强制类型转换,防止警告
//参数3:参数2的大小
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("bind error!");
return -1;
}
printf("bind success\n");
//3、启动监听
//参数1:要启动监听的文件描述符
//参数2:挂起队列的长度
if(listen(sfd,128)==-1){
perror("listen error!");
return -1;
}
printf("listen success\n");
//4、阻塞等待客户端连接
//定义变量,用于接受客户端地址信息的结构体
struct sockaddr_in cin; //用于接收地址信息的结构体
socklen_t cin_len =sizeof(cin); //用于接收地址的长度
int newfd = accept(sfd,(struct sockaddr*)&cin,&cin_len);
//参数1:服务器套接字文件描述符
//参数2:用于接收客户端地址信息结构体的容器,如果不接收,也可以填NULL
//参数3:接收参数2的大小,如果参数2为NULL,则参数3也是NULL
if(newfd==-1){
perror("accept error!");
return -1;
}
printf("[%s:%d]:已连接成功!!!!\n", inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
//5、数据的收发
char rbuf[128]="";//数据容器
while(1){
bzero(rbuf,sizeof(rbuf)); //清空容器里的内容
//从套接字中获取信息
int res =recv(newfd,rbuf,sizeof(rbuf),0);
if(res==0){
printf("对端已下线");
break;
}
printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),rbuf);
//对收到的数据处理一下,回给客户端
strcat(rbuf,"*_*");
//将消息发给客户端
if(send(newfd,rbuf,strlen(rbuf),0)==-1){
perror("send error!");
return -1;
}
printf("发送成功\n");
}
//6、关闭套接字
close(newfd);
close(sfd);
printf("hello world");
return 0;
}
client.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define SER_PORT 8888 //服务器端口号
#define SER_IP "10.148.4.168" //服务器IP地址
#define CLI_PORT 9999 //客户端端口号
#define CLI_IP "10.148.4.168" //客户端IP地址
int main(int argc,const char*argv[]){
//1、创建用于通信的客户端套接字文件描述符
int cfd =socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1){
perror("socket error");
return -1;
}
printf("socket success cfd = %d\n", cfd);
//2、绑定ip地址和端口号(可选)
//2.1 填充要绑定的地址信息结构体
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port =htons(CLI_PORT);
cin.sin_addr.s_addr =inet_addr(CLI_IP);
//2.2绑定工作
if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
perror("bind error!");
return -1;
}
//3、连接服务器
//3.1填充要连接的服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family =AF_INET; //通信域
sin.sin_port =htons(SER_PORT); //端口号
sin.sin_addr.s_addr=inet_addr(SER_IP); //服务器IP
//3.2连接工作
if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("connect error");
return -1;
}
printf("连接服务器成功!\n");
//4、数据的收发
char wbuf[128]="";
while(1){
bzero(wbuf,sizeof(wbuf)); //清空容器
//从终端获取数据
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0; //将换行改为'\0'
//将数据发给服务器
if(send(cfd,wbuf,sizeof(wbuf),0)==-1){
perror("send error");
return -1;
}
//接收服务器发过来的消息
if(recv(cfd,wbuf,sizeof(wbuf),0)==-1){
printf("对端已下线");
break;
}
printf("收到服务器消息为:%s\n", wbuf);
}
//5、关闭套接字
close(cfd);
printf("hello world\n");
return 0;
}