socket实现全双工通信
客户端:
#define IP "192.168.127.80" //服务器IP地址
#define PORT 7266 // 服务器端口号
int main(int argc, const char *argv[])
{
//1.创建套接字:用于接收客户端链接请求
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket error");
return -1;
}
printf("socket success sockfd=%d\n",sockfd); //3
//2.绑定IP地址和端口号
//3.连接服务器
//3.1填充要连接的服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET; //协议族
sin.sin_port=htons(PORT); //服务器端口号
sin.sin_addr.s_addr=inet_addr(IP); //服务器IP
//3.2连接服务器
if(connect(sockfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
{
perror("connect error\n");
return -1;
}
printf("connect success\n");
//4.数据通信
char wbuf[128]=""; //用于接收信息
int res=fork();
if(res>0)
{
while(1)
{
//从终端获取数据
bzero(wbuf,sizeof(wbuf));
printf("\033[1;34;10m[客户端]请输入:\033[0m");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]='\0';
if(strcmp(wbuf,"quit")==0)
{
break;
}
//将数据发送给服务器
send(sockfd,wbuf,strlen(wbuf),0);
}
}
else if(res==0)
{
while(1)
{
//接收服务器发来的信息
bzero(wbuf,sizeof(wbuf));
recv(sockfd,wbuf,sizeof(wbuf),0);
printf("\033[1;32;10m\033[16D收到服务器的信息为:\033[0m%s\n",wbuf);
}
}
else{
perror("fork");
return -1;
}
//5.关闭套接字
close(sockfd);
return 0;
}
服务器端:
#define IP "192.168.127.80" //服务器IP地址
#define PORT 7266 // 服务器端口号
int main(int argc, const char *argv[])
{
//1.创建套接字:用于接收客户端链接请求
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket error");
return -1;
}
printf("socket success sockfd=%d\n",sockfd); //3
//2.绑定IP地址和端口号
//2.1填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET; //地址族
sin.sin_port=htons(PORT); //端口号
sin.sin_addr.s_addr=inet_addr(IP); //IP地址
//2.2绑定工作
if(bind(sockfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
{
perror("bind error");
return -1;
}
printf("bind success!\n");
//3.将套接字设置为被动监听状态
if(listen(sockfd,128)==-1)
{
perror("listen error\n");
return -1;
}
printf("listen success!\n");
//4.阻塞等待客户端链接请求
//定义地址信息结构体用于接收客户端地址信息
struct sockaddr_in cin;
socklen_t socklen=sizeof(cin); //接收地址信息的长度
//返回一个数据交互的文件描述符
int acceptfd=accept(sockfd,(struct sockaddr*)&cin,&socklen);
if(acceptfd==-1)
{
perror("accept error\n");
return -1;
}
printf("[\033[1;32;10m%s:%d]:已链接\033[0m \033[1;33;10macceptfd=%d\n\033[0m",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),acceptfd);//IP Port client
//数据通信
char rbuf[128]=""; //用于接收信息
int res=fork();
if(res>0)
{
while(1)
{
//向客户端发送信息
bzero(rbuf,sizeof(rbuf)); //清空容器
printf("\033[1;33;10m[服务器端]请输入:\033[0m");
fgets(rbuf,sizeof(rbuf),stdin);
send(acceptfd,rbuf,strlen(rbuf),0);
}
}
else if(res==0)
{
while(1)
{
//从套接字文件中读取信息
bzero(rbuf,sizeof(rbuf)); //清空容器
int ret=recv(acceptfd,rbuf,sizeof(rbuf),0);
if(ret==0)
{
printf("\033[1;33;10m客户端已下线\n\033[0m");
break;
}
else if(ret<0)
{
perror("recv");
return -1;
}
else
printf("\033[1;32;10m\033[17D[%s:%d]:\033[0m%s\n",\
inet_ntoa(sin.sin_addr),ntohs(cin.sin_port),rbuf);
}
}
else{
perror("fork");
return -1;
}
//6.关闭套接字
close(sockfd);
close(acceptfd);
return 0;
}
结果:
多个客户端接入服务器端