C语言WinSock学习笔记

yizhihongxing

下面我来详细讲解一下《C语言WinSock学习笔记》的完整攻略。

一、WinSock是什么

WinSock (Windows Sockets) 是一种技术,允许应用程序通过 TCP/IP 协议来进行网络通信,是 Windows 操作系统自带的一个 API。WinSock 可以使用基于 TCP 或者 UDP 协议的 Socket 通信方式来实现网络应用。

二、WinSock的基本使用

  1. 加载WinSock库

在使用WinSock API之前,需要加载WinSock库,代码如下所示:

#include <WinSock2.h>  // 加载WinSock库
#pragma comment(lib, "ws2_32.lib")  // 链接到WinSock库文件
  1. 初始化WinSock

在使用WinSock API之前,我们需要调用WSAStartup()函数来初始化WinSock库,代码如下所示:

WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    printf("WSAStartup failed!\n");
    return 1;
}
  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;
}
  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;
}
  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);
  1. 关闭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技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 通过实例了解java checked和unchecked异常

    通过实例了解java checked和unchecked异常的攻略: 一、了解checked和unchecked异常1. checked异常是指编译器在编译时就会检查,即程序在编译时必须对可能出现的checked异常进行处理,否则编译不会通过。2. unchecked异常是指编译器在编译时不会检查,即程序在运行时可能会抛出unchecked异常。3. 在Ja…

    C 2023年5月23日
    00
  • Audition打开提示错误代码0xc000007b怎么办?

    问题描述: Audition 是Adobe公司出品的专业音频编辑软件,但是有时候各位用户打开Audition时会遇到提示错误代码 0xc000007b 的提示,导致无法正常运行。这个错误通常是由于缺失或损坏系统组件或本地库文件而引起的。下面我们来了解一下如何解决Audition打开提示错误代码0xc000007b的问题。 解决方案: 以下是针对Auditio…

    C 2023年5月23日
    00
  • Qt多线程实现网络发送文件功能

    下面是实现“Qt多线程实现网络发送文件功能”的完整攻略: 一、背景介绍 在网络编程中,有时需要向服务器发送文件,这时使用多线程能够提高发送效率和用户体验。Qt作为跨平台的C++框架,在多线程编程上提供了很好的支持,可以方便地实现多线程发送文件功能。 二、实现步骤 1. 创建子线程类 需要在主线程中创建子线程类,继承QThread类,并在其中重写其run()函…

    C 2023年5月22日
    00
  • C++实现红黑树应用实例代码

    C++实现红黑树应用实例代码 什么是红黑树 红黑树(Red-Black Tree)是一种自平衡二叉查找树,在C++中的STL中的set和map就是基于红黑树实现的。红黑树满足以下性质: 每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶子节点(NIL节点,空节点)是黑色的。 如果一个节点是红色的,则它的两个子节点都是黑色的。 对于任意一个节点而言,其到…

    C 2023年5月24日
    00
  • VC中CWinThread类以及和createthread API的区别分析

    VC中CWinThread类是MFC(Microsoft Foundation Class)中提供的一个类,用于创建和管理Windows应用程序中的线程。这个类可以方便的管理线程的运行、暂停、停止和同步等操作,可以大大提高程序的可读性和可维护性。 与CWinThread类相比,CreateThread API函数则是Windows API中用于创建线程的函数…

    C 2023年5月22日
    00
  • VC++实现文件与应用程序关联的方法(注册表修改)

    在VC++中,我们可以实现文件与应用程序的关联,使得用户在打开这类文件时,默认使用该应用程序打开。这个过程需要通过修改注册表来实现,下面就是详细的攻略: 第一步:创建应用程序 首先,我们需要创建一个VC++的应用程序。创建好应用程序后,将其编译生成.exe程序。 第二步:修改注册表 在开始修改注册表之前,请先备份你的注册表。这是个安全建议。下面是修改的过程:…

    C 2023年5月23日
    00
  • CCleaner有哪些功能? CCleaner工具菜单的详细介绍

    CCleaner是一款非常实用的计算机清理工具,可以帮助我们快速、安全地清理电脑中的垃圾文件,加快系统运行速度,提高系统稳定性。下面是关于CCleaner的功能和工具菜单的详细介绍。 CCleaner的功能 CCleaner主要提供以下四个功能: 1. 清理系统垃圾文件 CCleaner可以自动清理电脑中的垃圾文件,包括浏览器的历史记录、cookies、临时…

    C 2023年5月23日
    00
  • C语言一个函数如何实现好几个return返回值

    在C语言中,一个函数可以实现多个return返回值,主要是通过条件分支语句来实现的。通常在编写函数时,我们需要在不同的条件下返回不同的值。下面是我总结的实现方法和示例。 实现方法 实现一个函数有多个返回值可以采用以下三种方法: 全部使用if/else的方式进行判断,每个分支在结尾return不同的值; 使用switch语句,每个case分支在结尾return…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部