(1)Socket网络套接字所需的头文件不同:
Windows系统:一般使用的是#include
Linux系统:一般使用的是#include
(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() (需要包含头文件
(6)获取错误码
Windows系统:getlasterror()/WSAGetLastError()
Linux系统:errno变量
服务器:
创建套接字socket()
将套接字与服务器网络信息结构体绑定bind()
将套接字设置为监听状态listen()
阻塞等待客户端的连接请求accept()(阻塞函数)
进行通信recv()/send()
关闭套接字close()
客户端:
创建套接字socket()
发送客户端连接请求connect()
进行通信send()/recv()
关闭套接字close()
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