欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于TCP/IP的回声服务器 (Linux环境)

程序员文章站 2024-03-23 10:27:04
...

注意

  1. 需要联网
  2. 需要修改IP地址为自己的IP地址。
    ifconfig查看自己的IP地址

服务器端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUF_SIZE (4096)

void* server(void* arg)
{
	int cli_fd = *(int*)arg;

	char buf[BUF_SIZE];
	for(;;)
	{
		// 接收数据
		int recv_size = read(cli_fd,buf,BUF_SIZE);
		if(0 >= recv_size || 0 == strcmp(buf,"quit"))
		{
			printf("客户端%d退出\n",cli_fd);
			close(cli_fd);
			pthread_exit(NULL);
		}
		printf("read:[%s],size:%d\n",buf,recv_size);
		strcat(buf,":return");

		// 发送数据
		int send_size = write(cli_fd,buf,strlen(buf)+1);
		if(0 >= send_size)
		{
			printf("客户端%d退出\n",cli_fd);
			close(cli_fd);
			pthread_exit(NULL);
		}
	}
}

int main()
{
	// 创建socket对象
	int svr_fd = socket(AF_INET,SOCK_STREAM,0);
	if(0 > svr_fd)
	{
		perror("socket");
		return -1;
	}

	// 准备通信地址(自己)
	struct sockaddr_in addr = {};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(6789);
	addr.sin_addr.s_addr = inet_addr("192.168.43.92");
	socklen_t addrlen = sizeof(addr);

	// 绑定socket对象与地址
	if(bind(svr_fd,(struct sockaddr*)&addr,addrlen))
	{
		perror("bind");
		return -1;
	}

	// 设置监听和排除数量
	if(listen(svr_fd,10))
	{
		perror("listen");
		return -1;
	}

	for(;;)
	{
		// 等待连接
		int cli_fd = accept(svr_fd,(struct sockaddr*)&addr,&addrlen);
		if(0 > cli_fd)
		{
			perror("accept");
			return -1;
		}

		// 创建线程服务客户端
		pthread_t tid;
		pthread_create(&tid,NULL,server,&cli_fd);
	}
}

客户端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUF_SIZE (4096)

int main()
{
	// 创建socket对象
	int cli_fd = socket(AF_INET,SOCK_STREAM,0);
	if(0 > cli_fd)
	{
		perror("socket");
		return -1;
	}

	// 准备通信地址(服务端)
	struct sockaddr_in addr = {};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(6789);
	addr.sin_addr.s_addr = inet_addr("192.168.43.92");

	// 连接服务端
	if(connect(cli_fd,(struct sockaddr*)&addr,sizeof(addr)))
	{
		perror("connect");
		return -1;
	}

	char buf[4096];
	for(;;)
	{
		printf(">>");
		gets(buf);
		int send_size = write(cli_fd,buf,strlen(buf)+1);
		if(0 >= send_size || 0 == strcmp(buf,"quit"))
		{
			printf("结束通信!\n");
			close(cli_fd);
			return 0;
		}

		int recv_size = read(cli_fd,buf,BUF_SIZE);
		if(0 >= recv_size)
		{
			printf("结束通信!\n");
			close(cli_fd);
			return 0;
		}
		printf("read:[%s],size:%d\n",buf,recv_size);
	}
}