进程网络通信简单实现

进程之间实现网络通信,windows系统下C语言实现,直接对实现的必要代码进行解释。

导入网络通信socket头文件。

1
2
3
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

初始化Winsock库

winsock库主要作用是为应用程序提供网络通信功能,

1
2
3
4
5
6
   WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
  1. WSAStartup()函数初始化Winsock库。
  2. MAKEWORD(2, 2)将两个字节组合成一个字,它的值为0x0202,表示要使用Winsock版本2.2。
  3. &wsaData:指向一个WSADATA结构体的指针。WSADATA结构体包含了关于Winsock库的信息,例如最高版本号、最大套接字描述符等。
  4. WSAStartup()成功,它将返回0。否则,它将返回一个非零错误代码。

初始化存储地址信息结构体

1
2
3
4
5
6
struct addrinfo hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
  1. addrinfo结构体包含了关于网络地址、协议和套接字类型的信息。
  2. ZeroMemory()清空结构体中,确保结构体中所有的字段都设置为默认值或已知状态。
  3. hints.ai_family = AF_INET,设置使用IPv4地址族。
  4. hints.ai_socktype = SOCK_STREAM使用流式套接字(如TCP)。
  5. hints.ai_protocol = IPPROTO_TCP,表示使用TCP协议。
  6. hints.ai_flags = AI_PASSIVE,创建一个被动套接字(即监听套接字),等待连接请求。

将主机名和端口转换为地址信息链表

1
2
3
4
5
6
7
   struct addrinfo * result = NULL;
int iResult = getaddrinfo(NULL, "8888", &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}
  1. getaddrinfo()解析服务器地址和端口信息,失败返回0
  2. 第一个参数是指向主机名或IP地址的指针,NULL表示使用本地主机。
  3. 第二参数表示连接服务器的端口号。
  4. 第三个参数包含了网络地址,协议和嵌套字类型的信息,用来初始化。
  5. WSACleanup()初始化Winsock库之后,始终进行清理操作。

创建嵌套字

1
2
3
4
5
6
7
8
SOCKET ListenSocket = INVALID_SOCKET;    
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}