【Linux网络编程】- 网络通信 (客户端与服务器建立连接)

目录

一:基于流套接字的编程流程

二:C/S架构 【客户端Client 服务器Server】  使用函数包括

三: 客户端与服务器建立连接【代码实现】


一:基于流套接字的编程流程

计算机网络基础学习

二:C/S架构 【客户端Client 服务器Server】  使用函数包括

测试计算机网络是否可用 计算机网卡是否损坏

三: 客户端与服务器建立连接【代码实现】

#include<iostream>
#include <sys/types.h>         
#include <sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>

using namespace std;

int main()
{
	pid_t pid = 0;
	char buf[50] = { 0 };
	struct sockaddr_in addr;
	int len = 0;
	int acceptfd = 0;

	//初始化网络 识别当前计算机是否可以联网
    //第一个参数:采用IPV4 IP地址 第二个参数:网络分配TCP 
	int socketfd = socket(AF_INET, SOCK_STREAM, 0);
	if (socketfd == -1)
	{
		perror("socket error");
	}
	else
	{
		cout << "socketfd = " << socketfd << endl;
		//确定用IPV4地址
		addr.sin_family = AF_INET;
		//服务器开放自己的IP地址给客户端连接使用   INADDR_ANY生成默认的可以联网的IP地址
		addr.sin_addr.s_addr = INADDR_ANY;
		//绑定服务器端口号0-65535  10000以下系统默认使用
		addr.sin_port = htons(10086);

		len = sizeof(addr);

		//bind 绑定ip地址 绑定端口号
		if (bind(socketfd, (struct sockaddr*)&addr, len) == -1)
		{
			perror("bind error");
		}

		if (listen(socketfd, 10) == -1)
		{
			perror("listen error");
		}

		cout << "网络搭建成功" << endl;

		while (1)
		{
			cout << "服务器等待客户端连接........." << endl;
			//服务器等待客户端连接 阻塞式函数 acceptfd在服务器代表已经连接成功的客户端
			acceptfd = accept(socketfd, NULL, NULL);

			cout << "有客户端成功连接 acceptfd = " << acceptfd << endl;

			pid = fork();
			if (pid == 0)
			{
				while (1)
				{
					int res = read(acceptfd, buf, sizeof(buf));
					cout << "服务器收到 res = " << res << "buf = "<<buf<< endl;
				}
			}
		}
	}
	return 0;
}

#include<iostream>
#include <sys/types.h>         
#include <sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>

using namespace std;

int main()
{
	char buf[50] = { 0 };
	struct sockaddr_in addr;
	int len = 0;
	//初始化网络 识别当前计算机是否可以联网
	//第一个参数:采用IPV4 IP地址 第二个参数:网络分配TCP 
	int socketfd = socket(AF_INET, SOCK_STREAM, 0);
	cout << "客户端 socketfd = " << socketfd << endl;
	if (socketfd == -1)
	{
		perror("socket error");
	}
	else
	{
		//确定用IPV4地址
		addr.sin_family = AF_INET;
		//客户端主动寻找服务器IP地址 127.0.0.1本机回环地址 192.168.75.128
		addr.sin_addr.s_addr = inet_addr("192.168.75.128");
		//绑定服务器端口号0-65535  10000以下系统默认使用
		addr.sin_port = htons(10086);

		len = sizeof(addr);

		//主动去连接服务器 IP和端口
		if (connect(socketfd, (struct sockaddr*)&addr, len) == -1)
		{
			perror("connect error");
		}
		else
		{
			cout << "客户端连接服务器成功" << endl;
		}

		while (1)
		{
			cin >> buf;
			int res = write(socketfd, buf, sizeof(buf));
			cout << "客户端发送 res = " << res << endl;
			bzero(buf, sizeof(buf));
		}
	}

	return 0;
}

 结果:一个服务器 ,可以接收多个客户端发送过来的消息,实现了网络通信。

测试中出现问题:

1.客户端先下线

 

解决:先关闭服务器 后关闭客户端

2.服务器 再运行

 

bind error 解决:等个三五分钟再次运行服务器。

对于以上问题的出现,纯属是因为刚刚学习服务器客户端网络通信,在今后的学习中会将问题进行改进。主要学习的是编码流程。 

猜你喜欢

转载自blog.csdn.net/m0_56051805/article/details/125814950