简易的客户端和服务器通信

一、TCP通信流程

1.server服务器端:

1)socket() 创建socket。
2)bind() 绑定服务器地址结构。
3)listen() 设置监听上限。
4)accept() 阻塞监听客户端连接。
5)read(fd…) 读socket缓冲区内容。
6)实现需要的功能。
8)close() 关闭 fd。

2.client 客户端:

1)socket() 创建socket。
2)connect() 与服务器建立连接。
3)write() 写数据到socket的写缓冲,将数据发送到服务器。
4)read() 读数据。
5)显示读取结果。
6)close() 关闭fd。

二、详细代码

1.服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


#define PERROR(str) \
{perror(str); exit (EXIT_FAILURE);}

int main (void)
{
	int sfd, cfd;
	int ret;
	char client_IP[1024];		//保存客户端的地址
	struct sockaddr_in ser_add, clt_add;	
	socklen_t addrlen;

	sfd = socket (AF_INET, SOCK_STREAM, 0);		//创建socket,AF_INET:IPV4,SOCK_SREAM:流式协议,
												//0:根据type选择代表的协议,SOCK_STREAM:TCP  , SOCK_DGRAM:UDP
	if (ret == -1)
		PERROR ("socket");

	ser_add.sin_family = AF_INET;				
	ser_add.sin_port = htons (666);			//设置端口为666,转换成网络格式
	ser_add.sin_addr.s_addr = htonl (INADDR_ANY);   //本机ip地址,127.0.0.1
	ret = bind (sfd, (struct sockaddr *)&ser_add, sizeof (ser_add));		//绑定服务器地址结构
	if (ret == -1)
		PERROR ("bind");
	
	ret = listen (sfd, 128);		//设置监听上限为128个
	if (ret == -1)
		PERROR ("listen");

	addrlen = sizeof (clt_add);
	cfd = accept (sfd, (struct sockaddr *)&clt_add, &addrlen);	//阻塞监听,连接成功,继续往下执行
	if (cfd == -1)
		PERROR ("accept");

	printf ("IP: %s	 port:%d\n", 
				inet_ntop (AF_INET, &ser_add.sin_addr, client_IP, sizeof (client_IP)),
				ntohs (ser_add.sin_port));

	int len;
	char buf[BUFSIZ];
	while (1)			//实现大小写转换
	{
		len = read (cfd, buf, BUFSIZ);	//读取客户端发来的数据
		printf ("%s",buf);
	}
	close (cfd);
	close (sfd);
	return 0;
}

2.客户端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>

#define PERROR(str) \
{perror(str); exit (EXIT_FAILURE);}

#define SEVR_PORT  666

int main (void)
{
	int cfd;
	struct sockaddr_in serv_addr;		//服务器的地址结构
	int count = 10;
	char buf[1024] = {0};

	cfd = socket (AF_INET, SOCK_STREAM, 0);		//创建套接字
	if (cfd == -1)
		PERROR ("socket");

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons (SEVR_PORT);
	inet_pton (AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);		//将点地址转换为网络地址,传入服务器的地址结构
	int ret = connect (cfd, (struct sockaddr *)&serv_addr, sizeof (serv_addr));		//使用现有的socket与服务器建立连接
	
	if (ret == -1)
		PERROR ("connect");

	while (count--)				//连接成功,发送10次数据
	{
		write (cfd, "I love u\n", 9);
		ret = read (cfd, buf, strlen (buf));
		//write (STDOUT_FILENO, buf, ret);
		printf ("%s", buf);
		sleep (1);
	}

	close (cfd);
	return 0;
}


3.测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38956024/article/details/107711197