下面我来详细讲解一下《C语言WinSock学习笔记》的完整攻略。
一、WinSock是什么
WinSock (Windows Sockets) 是一种技术,允许应用程序通过 TCP/IP 协议来进行网络通信,是 Windows 操作系统自带的一个 API。WinSock 可以使用基于 TCP 或者 UDP 协议的 Socket 通信方式来实现网络应用。
二、WinSock的基本使用
- 加载WinSock库
在使用WinSock API之前,需要加载WinSock库,代码如下所示:
#include <WinSock2.h> // 加载WinSock库
#pragma comment(lib, "ws2_32.lib") // 链接到WinSock库文件
- 初始化WinSock
在使用WinSock API之前,我们需要调用WSAStartup()函数来初始化WinSock库,代码如下所示:
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed!\n");
return 1;
}
- 创建Socket
创建Socket使用WinSock API中的socket()函数,代码如下所示:
SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET) {
printf("socket failed!\n");
return 1;
}
- 连接服务器
使用connect()函数连接到服务器,代码如下所示:
SOCKADDR_IN serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(12345);
if(connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("connect failed!\n");
closesocket(sock);
return 1;
}
- 发送和接收数据
使用send()函数发送数据,使用recv()函数接收数据,代码如下所示:
char sendbuf[1024] = "hello";
char recvbuf[1024];
int ret = 0;
ret = send(sock, sendbuf, strlen(sendbuf), 0);
if(ret == SOCKET_ERROR) {
printf("send failed!\n");
closesocket(sock);
return 1;
}
ret = recv(sock, recvbuf, sizeof(recvbuf), 0);
if(ret == SOCKET_ERROR) {
printf("recv failed!\n");
closesocket(sock);
return 1;
}
printf("recvbuf: %s\n", recvbuf);
- 关闭Socket
使用closesocket()函数关闭Socket,代码如下所示:
closesocket(sock);
三、示例1:TCP客户端
下面的示例程序是一个简单的TCP客户端,连接到服务器并发送一条"hello"消息,然后等待服务器的回复。
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(void) {
WSADATA wsaData;
int ret = 0;
SOCKET sock = INVALID_SOCKET;
SOCKADDR_IN serverAddr;
char sendbuf[1024] = "hello";
char recvbuf[1024];
// 加载WinSock库
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed!\n");
return 1;
}
// 创建Socket
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET) {
printf("socket failed!\n");
return 1;
}
// 连接服务器
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(12345);
if(connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("connect failed!\n");
closesocket(sock);
return 1;
}
// 发送数据
ret = send(sock, sendbuf, strlen(sendbuf), 0);
if(ret == SOCKET_ERROR) {
printf("send failed!\n");
closesocket(sock);
return 1;
}
// 接收数据
ret = recv(sock, recvbuf, sizeof(recvbuf), 0);
if(ret == SOCKET_ERROR) {
printf("recv failed!\n");
closesocket(sock);
return 1;
}
printf("recvbuf: %s\n", recvbuf);
// 关闭Socket
closesocket(sock);
// 释放WinSock库资源
WSACleanup();
return 0;
}
四、示例2:TCP服务器
下面的示例程序是一个简单的TCP服务器,等待客户端连接,收到客户端发送的消息后回复一条"world"消息,然后关闭连接。
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(void) {
WSADATA wsaData;
int ret = 0;
SOCKET listenSock = INVALID_SOCKET;
SOCKET clientSock = INVALID_SOCKET;
SOCKADDR_IN serverAddr;
SOCKADDR_IN clientAddr;
int clientAddrLen = sizeof(clientAddr);
char recvbuf[1024];
char sendbuf[1024] = "world";
// 加载WinSock库
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed!\n");
return 1;
}
// 创建Socket
listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listenSock == INVALID_SOCKET) {
printf("socket failed!\n");
return 1;
}
// 绑定IP和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(12345);
if(bind(listenSock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("bind failed!\n");
closesocket(listenSock);
return 1;
}
// 监听端口
if(listen(listenSock, SOMAXCONN) == SOCKET_ERROR) {
printf("listen failed!\n");
closesocket(listenSock);
return 1;
}
// 等待客户端连接
printf("waiting for clients...\n");
clientSock = accept(listenSock, (SOCKADDR*)&clientAddr, &clientAddrLen);
if(clientSock == INVALID_SOCKET) {
printf("accept failed!\n");
closesocket(listenSock);
return 1;
}
printf("client accept from: %s:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
// 接收数据
ret = recv(clientSock, recvbuf, sizeof(recvbuf), 0);
if(ret == SOCKET_ERROR) {
printf("recv failed!\n");
closesocket(clientSock);
closesocket(listenSock);
return 1;
}
printf("recvbuf: %s\n", recvbuf);
// 发送数据
ret = send(clientSock, sendbuf, strlen(sendbuf), 0);
if(ret == SOCKET_ERROR) {
printf("send failed!\n");
closesocket(clientSock);
closesocket(listenSock);
return 1;
}
// 关闭连接
closesocket(clientSock);
closesocket(listenSock);
// 释放WinSock库资源
WSACleanup();
return 0;
}
以上就是《C语言WinSock学习笔记》的完整攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言WinSock学习笔记 - Python技术站