windows Socket简单编程实例

news/2025/2/16 6:07:41/

 服务端

#include <winsock2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
int main(int argc, char* argv[])
{WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){error_handing("WSAStartup() error");}SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;char message[] = "hello world!";if (argc != 2){printf("Usage : %s <port>\n", argv[0]);exit(1);}hServSock = socket(AF_INET, SOCK_STREAM, 0);if (hServSock == INVALID_SOCKET){error_handing("socket() error");}memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_family = AF_INET;servAddr.sin_addr.s_addr = htonl(INADDR_ANY);servAddr.sin_port = htons(atoi(argv[1]));if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR){error_handing("bind() error");}if (listen(hServSock, 5) == SOCKET_ERROR){error_handing("listen() error");}szClntAddr = sizeof(clntAddr);hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);if (hClntSock == INVALID_SOCKET){error_handing("accept() error");}closesocket(hClntSock);closesocket(hServSock);WSACleanup();return 0;
}

客户端

#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <winsock2.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[])
{WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){error_handing("WSAStartup() error");}SOCKET hSocket;if (argc != 3){error_handing("argc error");}hSocket = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN servAddr;memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_family = AF_INET;servAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);servAddr.sin_port = htons(atoi(argv[2]));if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR){error_handing("connect error");}char message[30];int strlen = recv(hSocket, message, sizeof(message) - 1, 0);if (strlen == -1){error_handing("recv error");}printf("recv message: %s\n", message);closesocket(hSocket);WSACleanup();return 0;
}


http://www.ppmy.cn/news/1036138.html

相关文章

css鼠标样式 cursor: pointer

cursor: none; cursor:not-allowed; 禁止选择 user-select: none; pointer-events:none;禁止触发事件, 该样式会阻止默认事件的发生&#xff0c;但鼠标样式会变成箭头

拒绝摆烂!C语言练习打卡第二天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4dd;…

使用Vue和jsmind如何实现思维导图的历史版本控制和撤销/重做功能?

思维导图是一种流行的知识图谱工具&#xff0c;可以帮助我们更好地组织和理解复杂的思维关系。在开发基于Vue的思维导图应用时&#xff0c;实现历史版本控制和撤销/重做功能是非常有用的。以下为您介绍如何使用Vue和jsmind插件来实现这些功能。 安装依赖 首先&#xff0c;我们…

深入理解Vue 3.0x中的Suspense和异步组件

深入理解Vue 3.0x中的Suspense和异步组件 Vue 3.0x作为Vue.js框架的最新版本&#xff0c;引入了许多创新特性&#xff0c;其中Suspense和异步组件是重要的改进之一。在本文中&#xff0c;我们将深入探讨这两个特性&#xff0c;了解它们如何为现代Web应用带来更好的性能和用户体…

系统运维日常巡检都做什么

系统运维日常巡检都做什么 系统运维日常巡检是确保服务器和系统正常运行的关键活动。它涉及对硬件、软件和网络进行定期检查&#xff0c;以发现潜在问题并采取相应的措施。以下是系统运维日常巡检的一些常见任务&#xff1a; 1.硬件检查&#xff1a; 检查服务器硬件的健康状…

C#__使用委托升级冒泡排序

// 员工类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Delegate委托 {class Employee // 员工类{public string Name { get; set; }public double Salary { get; set; }public Employee…

深信服数据中心管理系统 XXE漏洞复现

0x01 产品简介 深信服数据中心管理系统DC为AC的外置数据中心&#xff0c;主要用于海量日志数据的异地扩展备份管理&#xff0c;多条件组合的高效查询&#xff0c;统计和趋势报表生成&#xff0c;设备运行状态监控等功能。 0x02 漏洞概述 深信服数据中心管理系统DC存在XML外部实…

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API&#xff0c;MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类…