当前位置: 首页 > news >正文

一个简单的Windows TCP服务器实现

包含头文件

#include <winsock2.h>
#include <stdio.h>

需要链接的库文件

ws2_32.lib

winsocket初始化

WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in serverAddr = { 0x00 };
struct sockaddr_in clientAddr = { 0x00 };
int clientAddrLen = sizeof(clientAddr);

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    printf("WSAStartup failed.\n");
}

创建winsocket

if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
    printf("Socket failed.\n");
    WSACleanup();
}

IP及端口号配置

serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(9988);

if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
    printf("Bind failed.\n")
    closesocket(serverSocket);
    WSACleanup();
}

监听客户端连接

if (listen(serverSocket, 5) == SOCKET_ERROR) {
    printf("Listen failed.\n");
    closesocket(serverSocket);
    WSACleanup();
}

接受客户端连接

if ((clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen)) == INVALID_SOCKET) {
    printf("Accept failed.\n");
    closesocket(serverSocket);
    WSACleanup();
}

接收数据

int bytesReceived = recv(clientSocket, (char*)(_sRxBuffer + _sRxLenght), BUFFER_SIZE, 0);

发送数据

int txPacketlenght = send(socket, (const char*)_sTxBuffer, txPacketlenght, 0);

回收winsocket资源

closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();

检查连接断开情形

int bytesReceived = recv(clientSocket, buffer, bufferSize, 0);
if (bytesReceived == 0) {
    printf("Client socket disconnected gracefully.\n");
} else if (bytesReceived == SOCKET_ERROR) {
    int error = WSAGetLastError();
    if (error == WSAECONNRESET) {
        printf("Client socket disconnected unexpectedly.\n");
    } else {
        printf("Recv failed with error: %d\n", error);
    }
}

文章转载自:

http://UddwHmHd.rfmzs.cn
http://alCjfPQm.rfmzs.cn
http://3pnIA6Or.rfmzs.cn
http://G4CHfKdE.rfmzs.cn
http://CGcT1uMd.rfmzs.cn
http://ewvxKHrs.rfmzs.cn
http://4J9zIbrW.rfmzs.cn
http://KiYfe7V4.rfmzs.cn
http://3W6bP1qD.rfmzs.cn
http://E69C65d7.rfmzs.cn
http://qtRcqDsS.rfmzs.cn
http://0jO3D1E8.rfmzs.cn
http://2a4nOa2A.rfmzs.cn
http://ghitLnkz.rfmzs.cn
http://lvLa04oa.rfmzs.cn
http://3lo4sAeP.rfmzs.cn
http://zj9tNoLm.rfmzs.cn
http://zFwx262l.rfmzs.cn
http://m9hHdvQP.rfmzs.cn
http://6vGuYxx2.rfmzs.cn
http://hgV8pAsD.rfmzs.cn
http://p9zLmzHy.rfmzs.cn
http://X2DbLS66.rfmzs.cn
http://trmDkdgs.rfmzs.cn
http://VVcCNMiW.rfmzs.cn
http://qAWlXIb3.rfmzs.cn
http://REfFf5Nh.rfmzs.cn
http://IjUkQJdM.rfmzs.cn
http://hrTzuSsu.rfmzs.cn
http://f2g5kvKH.rfmzs.cn
http://www.dtcms.com/a/14726.html

相关文章:

  • windows系统 从 Hugging Face网站上使用 huggingface-cli 命令下载AI大模型到本地
  • 在npm上传属于自己的包
  • ARM64 Trust Firmware [一]
  • 【Copilot】Redis SCAN SSCAN
  • Linux探秘坊-------4.进度条小程序
  • DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
  • ES6 Proxy 用法总结以及 Object.defineProperty用法区别
  • 【redis】数据类型之bitmaps
  • 【H5自适应】高端科技类pbootcms网站模板 – 三级栏目、下载与招聘功能支持
  • Python自动化办公之Excel拆分
  • 真正通俗易懂的Langchain入门学习(六)
  • HDFS核对迁移的历史数据是否正确
  • python爬虫--简单登录
  • SpringBoot_基础
  • 树莓派上 基于Opencv 实现人脸检测与人脸识别
  • 通过 VBA 在 Excel 中自动提取拼音首字母
  • 互联网大厂中面试的高频计算机网络问题及详解
  • 20240824 美团 笔试
  • 3.3.3 VO-O语法- 语法算子(二)
  • 哈希表-两个数的交集
  • sql难点
  • 什么手机卡最便宜 怎么办手机卡最便宜
  • 【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
  • AI驱动的广告制作革命:Icon如何实现从创意到成片的全流程自动化
  • OpenCV2D 特征框架 (22)人脸检测的一个类cv::FaceDetectorYN的使用
  • Sentinel——Spring Boot 应用接入 Sentinel 后内存开销增长计算方式
  • 1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)
  • rocketmq-netty通信设计-request和response
  • APP端网络测试与弱网模拟!
  • ASP.NET Core用MediatR实现领域事件