流式域套接字通信

本文详细介绍了使用C语言实现的Unix域Socket编程,包括服务器端创建套接字、绑定、监听、接受客户端连接,以及客户端连接服务器、发送和接收数据的过程。
摘要由CSDN通过智能技术生成
#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int sfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sfd == -1)
	{
        perror("socket error");
		return -1;
	}
	printf("sfd = %d 套接字创建成功\n",sfd);
	//判断要绑定的套接字是否存在
	if(access("./unix",F_OK)==0)
	{
       if(unlink("./unix")==-1)
	   {
          perror("unlink error");
		  return -1;
	   }
	}
	//2.绑定套接字文件
	//2.1填充地址信息结构体
	struct sockaddr_un uin;
	uin.sun_family = AF_UNIX;
	strcpy(uin.sun_path,"./unix");

	if(bind(sfd,(struct sockaddr *)&uin,sizeof(uin))==-1)
	{
        perror("bind error");
		return -1;
	}
	printf("绑定成功\n");
	//3.开启被动监听
	if(listen(sfd,128) == -1)
	{
        perror("listen error");
		return -1;
	}
	printf("开启被动监听成功\n");
	//4.等待客户端链接请求
	//4.1定义接收客户地址信息结构体
	struct sockaddr_un cin;
	socklen_t socklen = sizeof(cin);
	//4.2接收客户端
	int newfd = accept(sfd,(struct sockaddr *)&cin,&socklen);
	if(newfd == -1)
	{
       perror("accept error");
	   return -1;
	}
	printf("接收成功\n");
	//5.相互通信
	char sbuf[128] = "";
	while(1)
	{
       bzero(sbuf,sizeof(sbuf));
	   //从套接字中读取数据
	   int res = recv(newfd,sbuf,strlen(sbuf)-1,0);
	   if(res == 0)
	   {
           printf("客户端已下线\n");
		   break;
	   }
	   printf("[%s]:%s\n",cin.sun_path,sbuf);

	   strcat(sbuf,"*_*");
	   send(newfd,sbuf,strlen(sbuf),0);

	   printf("发送成功\n");
	}
	//6.关闭服务器
	close(newfd);
	close(sfd);

	return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int cfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(cfd == -1)
	{
        perror("socket error");
		return -1;
	}
	printf("cfd = %d 套接字创建成功\n",cfd);
	//判断要绑定的套接字是否存在
	if(access("./linux",F_OK)==0)
	{
       if(unlink("./linux")==-1)
	   {
          perror("unlink error");
		  return -1;
	   }
	}
	//2.绑定套接字文件
	//2.1填充地址信息结构体
	struct sockaddr_un uin;
	uin.sun_family = AF_UNIX;
	strcpy(uin.sun_path,"./linux");

	if(bind(cfd,(struct sockaddr *)&uin,sizeof(uin))==-1)
	{
        perror("bind error");
		return -1;
	}
	printf("绑定成功\n");
    //3连接服务器
	//3.1要连接的服务器的地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family = AF_UNIX;
	strcpy(sun.sun_path,"unix");
	//3.2连接服务器
	if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1)
	{
        perror("connect error");
		return -1;
	}
	printf("连接成功\n");
	//4.收发数据 
	char wbuf[128] = "";
	while(1)
	{
       printf("请输入>>>");
	   fgets(wbuf,sizeof(wbuf),stdin);
	   wbuf[strlen(wbuf)-1] = 0;
	   //设置退出
	   if(strcmp(wbuf,"quit")==0)
	   {
           break;
	   }
	   //将数据发送给服务器
	   send(cfd,wbuf,sizeof(wbuf),0);

	   //将数组清空
	   bzero(wbuf,sizeof(wbuf));
	   recv(cfd,wbuf,sizeof(wbuf)-1,0);
	   
	   printf("接收到的数组消息为>>%s\n",wbuf);
	}
    //关闭套接字
	close(cfd);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值