目录
二: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 解决:等个三五分钟再次运行服务器。
对于以上问题的出现,纯属是因为刚刚学习服务器客户端网络通信,在今后的学习中会将问题进行改进。主要学习的是编码流程。