进程之间实现网络通信,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; }
|
WSAStartup()
函数初始化Winsock库。
MAKEWORD(2, 2)
将两个字节组合成一个字,它的值为0x0202
,表示要使用Winsock版本2.2。
&wsaData
:指向一个WSADATA
结构体的指针。WSADATA
结构体包含了关于Winsock库的信息,例如最高版本号、最大套接字描述符等。
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;
|
addrinfo
结构体包含了关于网络地址、协议和套接字类型的信息。
ZeroMemory()
清空结构体中,确保结构体中所有的字段都设置为默认值或已知状态。
hints.ai_family = AF_INET
,设置使用IPv4地址族。
hints.ai_socktype = SOCK_STREAM
使用流式套接字(如TCP)。
hints.ai_protocol = IPPROTO_TCP
,表示使用TCP协议。
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; }
|
getaddrinfo()
解析服务器地址和端口信息,失败返回0
。
- 第一个参数是指向主机名或IP地址的指针,
NULL
表示使用本地主机。
- 第二参数表示连接服务器的端口号。
- 第三个参数包含了网络地址,协议和嵌套字类型的信息,用来初始化。
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; }
|