系统编程之网络编程(TCP客户端与服务器的搭建)

TCP是重要的传输层协议,是一种有连接的、可靠的传输。传输数据前要先建立连接,如果传输错误或者数据丢失,就会重传。因此使用TCP,开销大,速度慢。
UDP也是传输层协议,它是无连接的、不可靠的传输服务。不必要在数据传输之前建立会话,但可能造成数据的丢失。系统只保证尽力发送。优点是传输速度快、开销小。视频点播使用的就是UDP。
下面是我实现的TCP客户端与服务器的搭建:
服务器:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT 9999  //端口号

//服务器的搭建
int main()
{
	//创建一个套接字
	int listen_socket = socket(AF_INET,SOCK_STREAM, 0);
	if (listen_socket == -1)
	{
		perror("socket");
		return -1;
	}
	
	//命名套接字,绑定本地的ip地址和端口
	struct sockaddr_in addr;
	memset(&addr,0,sizeof(addr));   //清空
	addr.sin_family = AF_INET;      //设置地址族
	addr.sin_port = htons(PORT);    //设置端口
	addr.sin_addr.s_addr = htonl(INADDR_ANY);  //使用本地任意IP地址
	int ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof(addr));  //绑定
	if (ret == -1)
	{
		perror("bind");
		return -1;
	}
	
	//监听本地套接字
	if(listen(listen_socket, 5) == -1)
	{
		perror("listen");
		return -1;
	}
	
	while(1)
	{
		printf ("等待客户端连接.......\n");
		
		//接收连接
		// 监听套接字不能用来与客户端进行通信,它的职责是监听客户端的连接
		// accpet 处理客户端的连接,如果成功接收,会返回一个新的套接字,用来与客户端进行通信
		// accept的第三个参数 是一个传入传出参数
		struct sockaddr_in client_addr;  // 用来保存客户端的ip和端口信息
		int len = sizeof(client_addr);
		int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len);  //连接,返回新的套接字,用于和客户端通信
		if (client_socket == -1)
		{
			perror("accept");
			return -1;
		}
		
		printf ("成功接收一个客户端: %s\n", inet_ntoa(client_addr.sin_addr));
		char buf[1024];
		while (1)
		{
			int ret = read (client_socket, buf, 1023);
			if(ret == 0)
			{
				printf("client is close!\n");
				break;
			}
			buf[ret] = '\0';
			printf ("%s\n", buf);
			
			write (client_socket, buf, 1023);
		}
		close(client_socket);  //关闭客户端通信套接字
	}
	close(listen_socket);  //关闭监听套接字
	
	return 0;
	
}
	



客户端:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

//客户端的搭建
int main(int argc,char *argv[])
{
	if(argc!=3) 
	{ 
		fprintf(stderr,"Usage:%s hostname \a\n",argv[0]); 
		exit(1); 
	} 
	
	//创建一个套接字
	int server_socket = socket(AF_INET,SOCK_STREAM, 0);
	if (server_socket == -1)
	{
		perror("socket");
		return -1;
	}
	
	//设置IP地址和端口
	struct sockaddr_in addr;
	memset(&addr,0,sizeof(addr));
	addr.sin_family = AF_INET;      //设置地址族
	addr.sin_port = htons((unsigned short)atoi(argv[2]));    //设置端口
	addr.sin_addr.s_addr = inet_addr(argv[1]);  //设置IP地址
	
	//连接服务器
	int ret = connect(server_socket, (struct sockaddr *)&addr,sizeof(struct sockaddr));
	if (ret == -1)
	{
		perror("bind");
		return -1;
	}
	printf ("连接到服务器:%s\n",argv[1]);
	
	char buf[1024];
	
	while (1)
	{
		printf("input:");
		scanf ("%s",buf);
		write (server_socket,buf, 1023);
		int ret = read (server_socket, buf, 1023);
		buf[ret] = '\0';
		printf ("receive = %s\n", buf);
	}
	
	close(server_socket);  //关闭套接字

	return 0;
	
}



运行结果:
系统编程之网络编程(TCP客户端与服务器的搭建)_第1张图片

本程序还只能实现一个客户端的连接,想要实现多个客户端连接,就要用到多线程编程。

你可能感兴趣的:(系统编程)