实验目的:

掌握Winsock2.0套接字编程技术的基本方法。

实验要求:

运用TCP/IP Winsock2.0套接字编程技术,使用VC编写一个面向连接通信的服务端程序与客户端程序,服务器先与端口3000绑定,

然后等待客户连接,连接成功后就可与客户端互相收、发信息。交互中,通信任一方只要发送 bye, 通信过程便自动结束。

服务端:

#include <conio.h>
#include <stdio.h>
#include <winsock2.h> #pragma comment(lib, "Ws2_32.lib") int main(int, char **)
{
struct sockaddr addr;
int recvLen, errCode; char msg[] = {};
SOCKET sock, sersock; WORD wVersionRequested;
WSADATA wsaData;
LPSTR messageBuffer = NULL; SetConsoleTitle("服务端"); wVersionRequested = MAKEWORD(, );
errCode = WSAStartup(wVersionRequested, &wsaData); if (errCode)
{
printf("没有Windows Socket动态库!\n");
return WSAGetLastError();
} if (LOBYTE(wsaData.wVersion) != || //不是Winsock 2.0
HIBYTE(wsaData.wVersion) != )
{
printf("需要Windows Socket 2!\n");
WSACleanup();
return WSAGetLastError();
} sock = socket(AF_INET, SOCK_STREAM, ); if (sock == INVALID_SOCKET)
{
printf("不能创建Socket!\n");
getch();
WSACleanup();
return ;
} ((sockaddr_in *)&addr)->sin_family = AF_INET; ((sockaddr_in *)&addr)->sin_port = htons(); ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1"); bind(sock, &addr, sizeof(addr)); listen(sock, ); printf("等待客户连接!\n");
recvLen = sizeof(addr);
sersock = accept(sock, &addr, &recvLen); if (sersock == INVALID_SOCKET)
{
errCode = WSAGetLastError(); size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&messageBuffer, , NULL); printf("%s\n", messageBuffer);
free(messageBuffer); getch();
closesocket(sock);
WSACleanup();
return ;
} printf("有客户连接!\n输入bye通信结束\n"); do
{
printf("\n等待客户端输入信息......");
recvLen = recv(sersock, msg, , );
printf("\n客户端:%s", msg); if (!strcmp(msg, "bye"))
break;
printf("\n服务器:");
gets(msg); send(sersock, msg, strlen(msg) + , ); } while (strcmp(msg, "bye")); closesocket(sersock);
closesocket(sock);
printf("\n\n会话结束,按任一键返回\n");
getch();
WSACleanup();
return ;
}

客户端:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h> #pragma comment(lib, "Ws2_32.lib") int main(int, char **)
{
SOCKET sock;
struct sockaddr addr;
int errCode;
char msg[] = {}; WORD wVersionRequested;
WSADATA wsaData; SetConsoleTitle("客户端");
wVersionRequested = MAKEWORD(, );
errCode = WSAStartup(wVersionRequested, &wsaData); if (errCode)
{
printf("没有Windows Socket动态库!\n");
return WSAGetLastError();
} if (LOBYTE(wsaData.wVersion) != ||
HIBYTE(wsaData.wVersion) != )
{
printf("需要Windows Socket 2!\n");
WSACleanup();
return WSAGetLastError();
} sock = socket(AF_INET, SOCK_STREAM, ); if (sock == INVALID_SOCKET)
{
printf("不能创建Socket!\n");
getch();
WSACleanup();
return WSAGetLastError();
} ((sockaddr_in *)&addr)->sin_family = AF_INET; ((sockaddr_in *)&addr)->sin_addr.s_addr = inet_addr("127.0.0.1"); ((sockaddr_in *)&addr)->sin_port = htons(); printf("与服务器连接...!\n"); errCode = connect(sock, (sockaddr *)&addr, sizeof(addr));
if (errCode == SOCKET_ERROR)
{
printf("连接失败!\n");
getch();
WSACleanup();
return ;
} printf("成功连接到服务器127.0.0.1!\n若输入bye则通信结束\n"); do
{
printf("\n\n客户端:");
gets(msg); send(sock, msg, strlen(msg) + , ); if (!strcmp(msg, "bye")) break; printf("等待服务器响应......\n"); recv(sock, msg, , ); printf("服务器:%s", msg); } while (strcmp(msg, "bye")); closesocket(sock);
printf("\n会话结束,按任一键返回\n");
getch();
WSACleanup();
return ;
}

运行效果:

此为学校实验题目:word排版请用http://www.planetb.ca/syntax-highlight-word

Winsock2.0相关参考网站,拥有大量示例代码:https://www.tenouk.com/

WinSock2.0通信的一个例子(基于VC++6.0开发测试)的更多相关文章

  1. 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!

    自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接

  2. 通过一个例子感受C# 6.0新特性

    微软在Visual Studio 2015中更新C#语言到6.0,添加了很多很好的特性,以使C#语言继续跻身于最优秀语言之行列.下面通过一个例子快速感受一下C# 6.0的新特性,以下程序在VS2015 ...

  3. LabVIEW串口通信的一个例子-串口"示波器"

    1.程序界面:<ignore_js_op> 功能介绍:左边上方串口接收区,下方为串口字符发送区.右方为一个波形图表,在程序内部每次将串口发送过来的数据,以f%格式化,显示在波形图表上.按钮 ...

  4. Vue组件间通信:一个例子学会Vue组件-Vue.js学习总结)(转载)

    详情请点击 http://www.jianshu.com/p/9ad1ba89a04b

  5. gtk+3.0的环境配置及基于gtk+3.0的python简单样例

    /*********************************************************************  * Author  : Samson  * Date   ...

  6. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  7. (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

    此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...

  8. 基于VC++的WinCE网口通信

    基于VC++的WinCE网口通信 WinCE下的网络编程与Windows下的非常类似,只是个别API函数有所不同.同样分为UDP和TCP两种,UDP就是无连接的通信,通过“用户数据报协议”(UDP)来 ...

  9. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

随机推荐

  1. Python的插件化开发概述

    Python的插件化开发概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.插件化开发 动态导入: 运行时,根据用户需求(提供字符串),找到模块的资源动态加载起来. 1> ...

  2. 团队项目-Beta冲刺

    请大家在每次作业开头添加格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 <写上团队名称>(附上团队博客链接) 这 ...

  3. Python爬取mn52网站美女图片以及图片防盗链的解决方法

    防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...

  4. Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程

    下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...

  5. gulp-htmlmin 页面压缩插件 gulp插件 参数说明

    gulpfile.js var gulp = require('gulp'), htmlmin = require('gulp-htmlmin'); gulp.task('testHtmlmin', ...

  6. c#中的继承学习总结

    c#的继承方法,大体上和c++的类似,但是有点区别的,我这里刚刚初学,因此把重点记录下. 1.派生类继承了父类,那么,如果父类的方法和数据都是public,那么派生类都会继承.派生类可以直接调用父类的 ...

  7. Django API接口FK ManyTo Many 模板

    Url from django.contrib import admin from django.urls import path, re_path from django.urls import i ...

  8. Oracle EXPDP导出数据

    Oracle expdp导出表数据(带条件): expdp student/123456@orcl dumpfile=student_1.dmp logfile=student_1.log table ...

  9. 洛谷 P1717 钓鱼 题解

    每日一题 day46 打卡 Analysis 首先通过题目我们不难发现,为了得到最优解,那么就不能把时间浪费在路上,也就是说不能走回头路.然后很容易可以发现,在每个时刻在不同的鱼塘钓到的鱼的数量是不同 ...

  10. 洛谷P3509 Frog

    题目 首先分析数据范围发现m很大,所以线性做法肯定不行,因此考虑倍增,即预处理出每个点跳1次后的位置.然后只用两个数组类似于快速幂,推出每个点跳m次后的位置. 预处理离每个点第k小的点,可以用长度为k ...