服务器和客户端
套接字网络应用程序有两种不同类型:服务器和客户端。
服务器和客户端具有不同的行为创建过程是不同的。
下面是用于创建流式 TCP/IP 服务器和客户端的常规模型。
服务器创建步骤:
1、初始化 Winsock。
2、创建套接字。
3、绑定套接字。
4、在套接字上侦听客户端。
5、接受来自客户端的连接。
6、接收和发送数据。
7、断开连接。
客户端创建步骤:
1、初始化 Winsock。
2、创建套接字。
3、连接到该服务器。
4、发送和接收数据。
5、断开连接。
详情可参考微软官网示例:https://docs.microsoft.com/zh-cn/windows/win32/winsock/about-clients-and-servers#server
程序运行事项:
启动客户端应用程序之前应启动服务器应用程序。
客户端尝试连接到 TCP 端口27015上的服务器。 客户端连接后,客户端会将数据发送到服务器,并接收从服务器发送回的任何数据。 然后,客户端会关闭套接字并退出。
Linux套接字代码:https://blog.csdn.net/a15322910600/article/details/119567386
服务器端代码如下:
#include <stdio.h> //输入和输出
#include <stdlib.h> //动态内存管理,随机数生成,与环境的通信,整数算数,搜索,排序和转换
#include <WinSock2.h> //传输通信
#include <WS2tcpip.h> //用于检索ip地址的新函数和结构
#include <Windows.h>
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#define DEFAULT_PORT "27015" //默认端口
#define DEFAULT_BUFLEN 512 //默认缓冲区
#pragma comment(lib,"Ws2_32.lib") //引入ws2_32.lib库,不然编译报错
int _cdecl main(int argc, char* argv) {
printf("服务器\n\n");
//WSADATA结构包含有关Windows Sockets实现的信息。
WSADATA wsaData;
int iResult; //结果
//Winsock进行初始化
//调用 WSAStartup 函数以启动使用 WS2 _32.dll
//WSAStartup的 MAKEWORD (2,2) 参数发出对系统上 Winsock 版本2.2 的请求,并将传递的版本设置为调用方可以使用的最高版本的 Windows 套接字支持。
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("初始化Winsock出错:%d\n", iResult);
return 1;
}
#pragma region 为服务器创建套接字
//初始化之后,必须实例化套接字对象以供服务器使用
//getaddrinfo函数提供从ANSI主机名到地址的独立于协议的转换。
//getaddrinfo函数使用addrinfo结构来保存主机地址信息。
struct addrinfo* result = NULL, * ptr = NULL, hints;
//ZeroMemory 函数,将内存块的内容初始化为零
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET; //用于指定ipv4地址族
hints.ai_socktype = SOCK_STREAM; //指定流套接字
hints.ai_protocol = IPPROTO_TCP; //指定tcp协议
//指定getaddrinfo函数中使用的选项的标志。 AI_PASSIVE表示:套接字地址将在调用bindfunction时使用。
hints.ai_flags = AI_PASSIVE;
//解析服务器地址和端口
//getaddrinfo函数提供从ANSI主机名到地址的独立于协议的转换。
//参数1:该字符串包含一个主机(节点)名称或一个数字主机地址字符串。
//参数2:服务名或端口号。
// 参数3:指向addrinfo结构的指针,该结构提供有关调用方支持的套接字类型的提示。
//参数4:指向一个或多个包含主机响应信息的addrinfo结构链表的指针。
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (iResult != 0) {
printf("解析地址\\端口失败: %d\n", iResult);
WSACleanup();
return 1;
}
//创建名为 ListenSocket 的 套接字 对象,使服务器侦听客户端连接。
SOCKET ListenSocket = INVALID_SOCKET;
//为服务器创建一个SOCKET来监听客户端连接
//socket函数创建绑定到特定传输服务提供者的套接字。
//参数1:地址族规范
//参数2:新套接字的类型规范
//参数3:使用的协议
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
/