第三章:域套接字(一)

发布于:2025-02-11 ⋅ 阅读:(27) ⋅ 点赞:(0)

作业:

1、流式域套接字敲一遍。

/*******************************************************/
//=> File Name: local_tcp.c
//=> Author: Water
//=> Mail: 1249496568@qq.com 
//=> Created Time: 2024年12月30日 星期一 16时46分28秒
/*******************************************************/

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//1、创建本地域套接字文件
	int oldfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	//2、绑定本地套接字文件(不存在的文件)
	if(access("./server",F_OK) == 0)
	{
		if(unlink("./server") == -1)
		{
			perror("unlink");
			return -1;
		}
	}
	struct sockaddr_un server;
	server.sun_family = AF_UNIX;
	strcpy(server.sun_path,"server");
	if(bind(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1)
	{
		perror("bind");
		return -1;
	}
	//3、监听
	if(listen(oldfd,10) == -1)
	{
		perror("listen");
		return -1;
	}
	//4、接收客户端请求
	struct sockaddr_un client;
	int client_len = sizeof(client);
	int newfd = accept(oldfd,(struct sockaddr *)&client,&client_len);
	if(newfd == -1)
	{
		perror("accept");
		return -1;
	}
	printf("%s发来连接请求\n",client.sun_path);
	char buff[1024];
	while(1)
	{
		recv(newfd,buff,sizeof(buff),0);
		printf("%s\n",buff);
		strcat(buff,"客户端已收到\n");
		send(newfd,buff,sizeof(buff),0);
	}
	return 0;
}
/*******************************************************/
//=> File Name: send_client.c
//=> Author: Water
//=> Mail: 1249496568@qq.com 
//=> Created Time: 2024年12月30日 星期一 17时17分22秒
/*******************************************************/

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//1、创建本地域套接字文件
	int oldfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	//2、绑定本地套接字文件(不存在的文件)
	if(access("./client",F_OK) == 0)
	{
		if(unlink("./client") == -1)
		{
			perror("unlink");
			return -1;
		}
	}
	struct sockaddr_un client;
	client.sun_family = AF_UNIX;
	strcpy(client.sun_path,"./client");
	if(bind(oldfd,(struct sockaddr *)&client,sizeof(client)) == -1)
	{
		perror("bind");
		return -1;
	}
	//3、连接服务器
	struct sockaddr_un server;
	server.sun_family = AF_UNIX;
	strcpy(server.sun_path,"server");
	if(connect(oldfd,(struct sockaddr *)&server,sizeof(server)) == -1)
	{
		perror("connect");
		return -1;
	}
	//4、接收数据
	char buff[1024];
	while(1)
	{
		fgets(buff,sizeof(buff),stdin);
		send(oldfd,buff,sizeof(buff),0);
		printf("发送成功\n");
		recv(oldfd,buff,sizeof(buff),0);
		printf("接收服务器消息:%s\n",buff);
		bzero(buff,sizeof(buff));
	}
	close(oldfd);
	return 0;
}

2.、UDP的客户端服务器实现一遍。

/*******************************************************/
//=> File Name: send.c
//=> Author: Water
//=> Mail: 1249496568@qq.com 
//=> Created Time: 2024年12月30日 星期一 09时38分59秒
/*******************************************************/

#include<myhead.h>
#define PORT 6666
#define IP "192.168.124.255"
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	//2、设置允许广播
	int k = 1;
	if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&k,sizeof(k)) == -1)
	{
		perror("setsockopt");
		return -1;
	}
	printf("允许广播设置成功\n");
	//3、填充广播地址信息结构体
	struct sockaddr_in broadcast = 
	{
		.sin_family = AF_INET,
		.sin_port = htons(PORT),
		.sin_addr.s_addr = inet_addr(IP)
	};
	char buff[1024];
	while(1)
	{
		fgets(buff,sizeof(buff),stdin);
		sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&broadcast,sizeof(broadcast));
		if(strcmp(buff,"quit") == 0)
		{
			printf("发送端退出\n");
			break;
		}
	}
	close(oldfd);
	return 0;
}
/*******************************************************/
//=> File Name: recv.c
//=> Author: Water
//=> Mail: 1249496568@qq.com 
//=> Created Time: 2024年12月30日 星期一 10时09分33秒
/*******************************************************/

#include<myhead.h>
#define IP "192.168.124.255"
#define PORT 6666
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int oldfd = socket(AF_INET,SOCK_DGRAM,0);
	if(oldfd == -1)
	{
		perror("socket");
		return -1;
	}
	//2、填充广播地址信息结构体
	struct sockaddr_in send = 
	{
		.sin_family = AF_INET,
		.sin_port = htons(PORT),
		.sin_addr.s_addr = inet_addr(IP)
	};
	if(bind(oldfd,(struct sockaddr *)&send,sizeof(send)) == -1)
	{
		perror("bind");
		return -1;
	}
	//3、接受消息
	char buff[1024];
	while(1)
	{
		recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);
		printf("%s",buff);
	}
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到