您现在的位置是:首页 >技术教程 >windows下网络编程与Linux下网络编程的区别网站首页技术教程

windows下网络编程与Linux下网络编程的区别

伴君 2023-05-25 12:00:03
简介windows下网络编程与Linux下网络编程的区别

一、windows下网络编程与Linux下网络编程的区别

(1)Socket网络套接字所需的头文件不同:
  Windows系统:一般使用的是#include <winsock2.h>
  Linux系统:一般使用的是#include <sys/socket.h>
(2)网络初始化
  Windows系统:需要用WSAStartup来启动 Winsock DLL 的使用,进行网络初始化 。WSAStartup 函数必须是应用程序或 DLL 调用的第一个 Windows 套接字函数。 它允许应用程序或 DLL 指定所需的 Windows 套接字版本,并检索特定 Windows 套接字实现的详细信息。 应用程序或 DLL 只能在成功调用 WSAStartup 后发出进一步的 Windows 套接字函数。一般我们可以通过定义一个初始化函数来完成网络初始化(PS:使用WSAStartup之前需要将ws2_32.lib这个库加入到工程里)

//初始化网络库
#pragma comment(lib,"ws2_32.lib")
void InitNetwork() {
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(2, 2);

	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		return;
	}
}

  Linux系统:无需网络初始化操作
(3)windows下没有write read函数,没有一切皆文件的概念(很重要)

//linux系统下
// socket_fd 套接字;
// num			是一个int类型的变量
write(socket_fd, &num, sizeof(num));
read(socket_fd, &num, sizeof(num));
	
//因为windows下没有一切皆文件的概念,所以write函数和linux系统下不同,上面代码可以改为
send(socket_fd, (char *)&num, sizeof(num), 0);
recv(socket_fd, (char *)&num, sizeof(num), 0);

(4)关闭socket套接字
Windows下closesocket()
Linux下close()
(5)设置非阻塞
Windows系统:ioctlsocket()
Linux系统:fcntl() (需要包含头文件<fcntl.h>)
(6)获取错误码
Windows系统:getlasterror()/WSAGetLastError()
Linux系统:errno变量

二、Linux系统下网络编程步骤(以TCP为例)

服务器:
​ 创建套接字socket()
​ 将套接字与服务器网络信息结构体绑定bind()
​ 将套接字设置为监听状态listen()
​ 阻塞等待客户端的连接请求accept()(阻塞函数)
​ 进行通信recv()/send()
​ 关闭套接字close()

客户端:
​ 创建套接字socket()
​ 发送客户端连接请求connect()
​ 进行通信send()/recv()
​ 关闭套接字close()

三、windows下的网络编程(以TCP为例):

windows既提供上层的网络API函数也提供底层的API函数。

1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:
客户端:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
服务器端:
先调用AfxSocketInit()检测协议栈安装情况
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()

2、对于采用底层的API函数而言,步骤如下:
客户端:
初始化网络WSAStartup()
​ 创建套接字socket()
​ 发送客户端连接请求connect()
​ 进行通信send()/recv()
​ 关闭套接字close()

服务器端:
初始化网络WSAStartup()
创建套接字socket()
​ 将套接字与服务器网络信息结构体绑定bind()
​ 将套接字设置为监听状态listen()
​ 阻塞等待客户端的连接请求accept()(阻塞函数)
​ 进行通信recv()/send()
​ 关闭套接字close()

参考:https://www.cnblogs.com/gildoringlorin/p/3951317.html

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。