自学内容网 自学内容网

socket实现全双工通信,多个客户端接入服务器端

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;
}

 

结果: 

 

多个客户端接入服务器端 

 


原文地址:https://blog.csdn.net/m0_75102741/article/details/140722802

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!