Windows网络编程socket,服务器和客户端代码

服务器和客户端

套接字网络应用程序有两种不同类型:服务器和客户端。

服务器和客户端具有不同的行为创建过程是不同的。
下面是用于创建流式 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);

	/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值