服务器 winsock修复,服务器/客户端:winsock 编程初体验

2023-10-26

服务器/客户端:winsock 编程初体验

前日看到听风大哥的帖子,写的是windows下的C/S程序的简易示例代码,顿时有了感觉。以前在linux下写过,但是不知道如何去实际应用,便放在了一边。昨晚认真的拜读、改写了一下。今日记录下来,作为保留。

代码如下:

服务端:

/*Service*/

#include //初始化网络编程函数

#include

#pragma comment(lib,"ws2_32") //静态函数库的初始化

#define PORT 139 //这个是用端口扫描器扫描的结果中任选的一个

int main(int argc,char *argv[])

{

system("cls"); //清屏

//定义一个数据类型是DSADATA的wsaData的变量

//wsaData结构被用来保存AfxSocketlnit函数返回的Windows Sockets初始化信息

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2,2);

//加载winsock库,初始化系统环境,以便以后关于网络的函数调用

if(WSAStartup(sockVersion,&wsaData)!=0)

{

return -1;

}

//创建一个套接字,也就是我们的监听的端口

SOCKET sListen = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

//判断创建是否成功,失败返回INVALID_SOCKET

if(sListen == INVALID_SOCKET)

{

printf("socket error !\n");

return -1;

}

//在sockaddr_in结构中装入地址信息

sockaddr_in sin;

sin.sin_family = PF_INET;

sin.sin_port = htons(PORT); //htons:将主机无符号短整型数转换成网络字节顺序

sin.sin_addr.S_un.S_addr = INADDR_ANY;

//套接字和本地地址绑定

if(bind(sListen,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)

{

printf("bind error !\n");

closesocket(sListen);

return -1;

}

//设置套接字进入监听模式

if(listen(sListen,1)==SOCKET_ERROR)

{

printf("listen error !\n");

closesocket(sListen);

return -1;

}

//接受客户端的连接请求

sockaddr_in remoteAddr;

SOCKET sClient;

int nAddrlen = sizeof(remoteAddr);

char revData[255];

printf("等待连接...");

//接受一个新连接

sClient = accept(sListen,(SOCKADDR *)&remoteAddr,&nAddrlen);

if(sClient == INVALID_SOCKET)

{

printf("accept error !\n");

closesocket(sListen);

return -1;

}

//打印出连接者的ip

printf("\n接收到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr));

int flag = 1;

while(flag)

{

//直到连接到有效数据才打印出来

int ret = recv(sClient,revData,sizeof(revData),0);

if(ret > 0)

{

// 为防止打印出错,把字符串结尾设为0x00

revData[ret] = 0x00;

printf("Client : ");

printf("%s\n",revData);

}

if(strcmp(revData,"quit\0")==0)

{

closesocket(sClient);

closesocket(sListen);

WSACleanup();

exit(0);

}

memset(revData,0,sizeof(revData)); //清空缓冲区

char sendData[255];

printf("Service :");

scanf("%s",sendData);

//发送数据

send(sClient,sendData,sizeof(sendData),0);

if(strcmp(sendData,"quit\0")==0)

{

closesocket(sClient);

closesocket(sListen);

WSACleanup();

exit(0);

}

memset(sendData,0,sizeof(sendData)); //清空缓冲区

}

closesocket(sListen);

WSACleanup();

return 0;

}

/*

调试提示:开始-->运行-->输入"cmd"-->找到生成的xxx.exe程序所在路径-->输入:xxx 就可以了

*/

客户端:

/*Client*/

#include

#include

#pragma comment(lib,"ws2_32")

#define PORT 139 //端口扫描结果任意选的一个,也可以自定义式用argv[2]参数,然后用bind()函数进行绑定

int main(int argc,char *argv[])

{

system("cls"); //清屏

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2,2);

//加载winsock库

if(WSAStartup(sockVersion,&wsaData)!=0)

{

return -1;

}

//创建套接字

SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(sClient == INVALID_SOCKET)

{

printf("socket error !\n");

return -1;

}

//在sockaddr_in中装入服务器端的地址信息

sockaddr_in servAddr;

servAddr.sin_family = AF_INET;

servAddr.sin_port = htons(PORT);

servAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);

//连接到服务器端

if(connect(sClient,(sockaddr *)&servAddr,sizeof(servAddr))==SOCKET_ERROR)

{

printf("connect error !\n");

closesocket(sClient);

return -1;

}

printf("已连接到 : %s\n",argv[1]);

int flag = 1;

while(flag)

{

char sendData[255];

printf("Client : ");

scanf("%s",sendData);

send(sClient,sendData,sizeof(sendData),0);

if(strcmp(sendData,"quit\0")==0)

{

closesocket(sClient);

WSACleanup();

exit(0);

}

memset(sendData,0,sizeof(sendData)); //清空缓冲区

char revData[255];

//直到接收到有效数据才打印出来

int ret = recv(sClient,revData,sizeof(revData),0);

if(strcmp(revData,"quit\0")==0)

{

closesocket(sClient);

WSACleanup();

exit(0);

}

if(ret > 0)

{

//为防止打印出错,字符串末尾加上0x00

revData[ret] = 0x00;

printf("Service : %s\n",revData);

}

memset(revData,0,sizeof(revData)); //清空缓冲区

}

closesocket(sClient);

WSACleanup();

return 0;

}

/*

调试提示:开始-->运行-->输入"cmd"-->找到生成的xxx.exe程序所在路径-->输入:xxx 目标IP 就可以了

*/

客户端进行连接时,自己只实现了在一台电脑开两个端口进行对话,两台电脑之间试了几次未成功,实在不知道如何做。

不满足于上面代码的简易,打算继续用进程进行改写一下,使之能够更人性化一些,结果发现windows下的进程创建并不是fork()函数那么简单,而是CreatProcess()函数,不知所云,没学过windows编程,只能暂时搁浅了。windows进程编程技术啊,一定得学会。不然以后能有啥发展前途。

路漫漫其修远兮...吾将上下而求索。

PS:初学***编程(1)帖子链接:

http://bbs.51cto.com/thread-1048530-1.html

享受阳光,享受生活。愿与大家共同进步。

--刀刀

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器 winsock修复,服务器/客户端:winsock 编程初体验 的相关文章

  • postgres的时间转换

    天下苦postgres时间转换久已 最近在操作数据库时 遇到频繁的时间操作 每次弄完了就忘了 今天痛定思痛 下定决心 终于自己也受不了自己的lazy了 对postgres的时间操作进行一下总结 本文竟可能详尽的记录postgres中涉及到d
  • 对称二叉树(Leetcode &101)

    题目 101 对称二叉树 思路 使用层序遍历 遍历当前层的节点时 如该节点的左 右 孩子为空 在list中添加null 否则加入左 右 孩子的值 每遍历完一层则对当前list进行判断 这里判断我用了一个很笨的方法 前面记录下一层节点值时就设
  • tomcat内存(jvm)、并发、缓存优化

    内存调优 rem次调整为高并发内存调优 rem 以下配置为JVM参数调优 set JAVA OPTS server rem 以服务器模式启动 启动速度慢 但更稳定 性能更好 Xms8192M rem 由于本机内存为16G 这里就设置成8G
  • 最全ES6详解及用法

    最全ES6详解及用法 前言 babel babel使用方法 变量的定义 let const this 和作用域 do 顶层对象 global对象 import class JS中的原型 原型语言 prototype proto constr
  • 降低 CPU 占用率的方法

    CPU 占用率和什么有关 答 1 单位时间内执行的指令数目多少 用户时间 2 I O操作时间 等待时间 3 线程调度花费的时间 软 硬中断 优先级调整时间 举个例子 好比一个大人 每次来回可以扛一袋大米 每天的任务要求扛 60 袋 假定来回
  • 软件架构设计

    软件架构设计 一 引言 软件架构的概念 软件架构设计及其生命周期 1 需求分析阶段 需求分析与SA研究二者的联系 2 设计阶段 3 实现阶段 4 构件组装阶段 5 部署阶段 6 后开发阶段 软件架构的重要性 引言 从第一个程序被划分成模块开
  • Unity3D 场景切换

    在Unity3D中 一个场景在运行中切换到另一个场景的方法 1 在Unity中 File gt Build Settings gt 把要切换的场景添加到Scenes In Build下面 也可以Add Open Scenes 添加完关闭这个
  • 详解Java中的BIO、NIO、AIO

    1 详解Java中的BIO NIO AIO 1 1 引言 IO流是Java中比较难理解的一个知识点 但是IO流在实际的开发场景中经常会使用到 比如Dubbo底层就是NIO进行通讯 本文将介绍Java发展过程中出现的三种IO BIO NIO以
  • 渗透测试笔记(五)——XSS跨站脚本攻击

    XSS简介 XSS Cross Site Scripting 跨站脚本 为了避免与CSS混淆 所以简称XSS XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点 进而添加一些代码 嵌入到Web页面中去 使别的用户访
  • 会话追踪技术:cookie、 URL重写

    servlet day4 会话追踪技术 cookie http协议的访问是无状态的访问 当前访问是不会知道之前访问的状态的 http协议的访问是不会帮我们保存访问的记录 痕迹的 有些时候需要记录之前的访问状态 比如在购物网站的时候 第一次访
  • 多线程与高并发编程进阶(二)

    前言 前文多线程与高并发入门中 已经介绍了多线程编程的目的以及实际应用中可能会遇到的问题 本文接着叙述关于多线程并发机制的底层原理 volatile以及synchronized 一般来说 Java代码从编写到最后的执行会经历以下的过程 Ja
  • 二叉树的基本操作(1)

    结点类型 struct TreeNode char val struct TreeNode l r TreeNode int x val x l nullptr r nullptr 新建一个类 名为solution 相关函数都放在这里面调用
  • 分类预测

    分类预测 MATLAB实现LSSVM 最小二乘支持向量机 分类 目录 分类预测 MATLAB实现LSSVM 最小二乘支持向量机 分类 最小二乘法 最小二乘支持向量机 程序设计 主程序 子程序 拓展知识 参考资料 致谢 最小二乘法 最小二乘法
  • 利用python实现163邮箱邮件的自动删除

    问题 163邮箱收信箱大量邮件无法批量删除 解决思路 利用python控制鼠标实现邮件自动删除 利用python的pyautogui实现鼠标的控制 import pyautogui as pg screenWidth screenHeigh
  • 海洋浮标数据显示系统

    R语言是现今世界上数据处理和可视化领域非常流行的数据处理语言 其类似于matlab 是开源的 功能强大的数据处理工具 Oracle是企业级的数据库 能够存储大量数据并且方便管理和使用 本文主要是基于R与oracle对美国国家海洋与大气管理局
  • 老师给我的指点——深刻剖析了我

    今天上午找导师有事 导师坐下来和我聊了聊 他说 就他的观察 我有以下几个方面的问题 一 感觉我在做事上总是欠缺那么一点东西 就是说 给我的事情 我是能做完也让别人没法批评我 但是总感觉欠缺一点东西 相比师妹 每次给任务1分可以做完1 2分
  • 函数式编程实例WordCount(林子雨老师慕课代码) 由于文件引入的问题之前报过Exception in thread “main“ java.lang.NullPointerExcept(已解决)

    函数式编程实例WordCount 数据文件目录 文件内容 刚开始在写文件的时候以为val dirfile new File data 这一行写的是具体文件 于是我写成了这样 运行之后始终给我报空指针异常 后面仔细研究文件 原来val dir
  • Linux 系统启动过程

    简介 Linux 系统启动过程大致分为5个阶段 1 内核的引导 2 运行 init 3 系统初始化 4 建立终端 5 用户登录系统 内核引导 计算机通电后 首先会进行 BIOS 开机自检 然后根据BIOS中设置的启动设备 一般是硬盘 来启动
  • Go开发 之 单端口转发到多个端口

    文章目录 1 背景 2 正题 3 源码 4 配置 5 效果 1 背景 运维和我提到这个需求的时候 我先是一愣 第一时间想到的是nginx 然后运维说nginx没有这个功能 之所以选择用go语言 主要两点 静态语言性能够用 不用部署其它包 可

随机推荐

  • 【linux操作系统知识】虚拟地址中:.data段和.bss段

    虚拟地址中 data段和 bss段 data段 为数据段 用来存放程序中已初始化并且初始化不为0的全局变量和静态局部变量 数据段属于静态内存分布 可读可写 bss段 称为未初始化段 用来存放未初始化或者初始化为0的全局变量和静态局部变量 b
  • MATLAB数据分析

    MATLAB数据分析 在实际应用中 经常需要对各种数据进行统计处理 以便为科学决策提供依据 这些统计处理包括求数据序列的最大值和最小值 和与积 平均值和中值 累加和与累乘积 标准方差和相关系数 排序等 MATLAB提供了相关的函数来实现 目
  • flutter实现可缩放可拖拽双击放大的图片功能

    flutter drag scale 可缩放可拖拽的功能 可实现图片或者其他widget的缩放已经拖拽 并支持双击放大的功能 我们知道官方提供了双击缩放 但是不支持拖拽的功能 我们要实现向百度地图那样可以缩放又可以拖拽的功能 官方的方法就不
  • unicloud 发布后小程序提示连接本地调试服务失败,请检查客户端是否和主机在同一局域网下

    1 hbuildx中小程序控制台切换连接方式 连接云端云函数 2 本地调试的话 连接本地云函数 并确定是否启动
  • 在eclipse的project explorer不小心删除了servers文件夹解决办法

    在eclipse的project explorer不小心删除了servers文件夹 解决办法 在Servers中删除tomcat 重新关联link一下就恢复了 但是得把build path的旧的server文件夹remove 再重新添加
  • 我们研究了853场世界杯比赛,发现了这几条稳赔不赚的竞猜攻略

    本文转载自大数据 ID hzdashuju 导读 世界杯开赛以来 据数据叔不完全统计 身边有66 6 的小伙伴上了天台 其中22 2 的人买了阿根廷赢 22 2 的人买了德国赢 还有22 2 的人买了巴西赢 剩下那33 4 的人 总是在问数
  • Unity性能优化

    Unity性能优化专栏第一期 目录 Unity性能优化专栏第一期 橙子前言 一 性能优化概念 Unity 3D 游戏优化瓶颈归根结底是开发过程中内存分配和使用不佳的结果 1 它们承担了它们这个级别不应该有的压力 2 它们没有受到应有的尊重
  • Arduino串口通信

    文章目录 通信类型 Arduino串口通信 硬串口 软串口 通信类型 通信是用来在不同电子设备之间交换数据用的技术 其实就是要实现不同电子设备之间的 通讯对话 Arduino串口通信 Arduino采用USART通信模式 可以有硬串口 软串
  • unity中动画控制器基础知识

    动画控制器的创建 1 在工程视图里 Create Aniamtor Contorller动画控制器 命名 双击 这时会在Animator视图中显示默认有三种状态 Entry 进入状态 Any State 任意状态 Exit 退出状态 如何添
  • OpenWRT 分流DNS的设置

    文章出处 OpenWRT 分流DNS的设置 Issue 57 luckyyyyy blog 我自己根据实际需要基于上方的链接内容进行了相关补充 OpenWRT配置IPv6的方法参考如下文章 OpenWRT IPv6 NAT配置 目前还是有许
  • servlet(二)文件的上传

    servlet实现文件的上传 文件上传是一个web应用常见的功能 比如 QQ头像 就使用了上传 邮箱中也有附件的上传和下载功能 OA系统中审批有附件材料的上传 1 1前端需要有个form表单标签 method post请求 因为post请求
  • 【MATLAB】最短路径Dijkstra算法

    目录 1 Dijkstra算法 1 1使用范围 1 2算法思路 1 3实例 2 代码 2 1dijstra函数 2 2调用函数 1 Dijkstra算法 1 1使用范围 bullet 寻求从一固定顶点到其余各点的最短路径
  • 实用Javascript 传值, 数据验证, 事件触发总结

    实用Javascript 传值 数据验证 事件触发总结 1 和JSP传值问题 1 普通提交form 的数据验证传值 html页面输入
  • :aftr和 :: after区别,顺便谈一谈CSS的伪类和伪元素

    在搞小程序的时时候会用到人家的组件button 人家弄了这个组件必然会设置一些默认值 比如边框 要想把这个边框弄没 就要用一下button after这个来处理一下 类似下面这样 button after border none 这时候 a
  • C语言里字符串的解析

    转自 https blog csdn net Code star one article details 78260482 函数名称 strtok 函数原型 char strtok char s1 const char s2 函数功能 分解
  • flink入门了解

    在线工程 在机器学习场景下 在线离线处理也会面临一些问题 首先会将离线的数据进行预处理和特征工程 如红框标注所示 然后进行离线的模型训练 训练好的模型会推到线上做推理 推理模块加载模型后 在线的数据也会有进行预处理和特征工程的过程 将处理之
  • lpr或商转公

    减少房贷的两种方法 1 央妈在2019推出lpr lpr你可以看作是根据市场变化的利率 如果你认为未来经济下行 利率下降 则你可以选择这个lpr作为房贷利率 否则则相反 lpr申请在2020 8月前都可以 后面就会根据lpr来还房贷 2 还
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用

    Docker是一种基于容器的虚拟化技术 它可以将应用程序及其依赖包装成一个独立的容器 使其可以在不同的平台上进行移植和部署 Docker的基本概念包括镜像 容器 仓库和服务 镜像是Docker应用程序的基础 包括应用程序及其依赖的组件 容器
  • Unity创建脚本显示自己的名字以及时间

    using UnityEngine using System IO using System Text using System public class QHF Editor UnityEditor AssetModificationPr
  • 服务器 winsock修复,服务器/客户端:winsock 编程初体验

    服务器 客户端 winsock 编程初体验 前日看到听风大哥的帖子 写的是windows下的C S程序的简易示例代码 顿时有了感觉 以前在linux下写过 但是不知道如何去实际应用 便放在了一边 昨晚认真的拜读 改写了一下 今日记录下来 作