孙鑫 VC++深入详解第14课——TCP通信/UDP通信(转)
原文转自 http://blog.csdn.net/supersonico/article/details/18900319
一.用VC++来编写TCP 服务器/客户端的简单程序。
注意事项:
1.要加载ws2_32.lib链接库。
项目->属性->弹出属性页->连接器->输入->附加依赖项
2.要使用#include <WinSock2.h>头文件。
实现步骤:
1.服务器端:
①加载套接字库 (可以直接从MSDN上复制 WSAStartup)
②创建socket
③绑定socket(bind)
④将socket设置成监听状态(listen)
⑤等待客户端的访问(accept)
⑥接收客户端信息(recv)
⑦往客户端发送信息(send)
⑧关闭套接字(closesocket)
⑨清除套接字库(WSACleanup)
#include <iostream>
#include <WinSock2.h>
#include <stdlib.h>
using namespace std; void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{
return;
}
if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return;
} //创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, ); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(); //绑定套接字
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
//将套接字设置为监听模式
listen(sockSrv, ); SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); while ()
{
//等待客户的请求到来
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[];
sprintf_s(sendBuf, , "Welcome %s", inet_ntoa(addrClient.sin_addr)); //发送数据
send(sockConn, sendBuf, strlen(sendBuf) + , );
char recvBuf[];
//接受数据
recv(sockConn, recvBuf, , );
//打印接受的数据
printf("%s\n", recvBuf);
//关闭套接字
closesocket(sockConn);
}
}
2.客户端:
①加载套接字库
②向服务器发送请求 connect
③接受服务器的信息 recv
④向服务器发送信息 send
⑤关闭套接字 closesocket
⑥清除套接字库 WSACleanup
#include <iostream>
#include <WinSock2.h>
#include <stdlib.h>
using namespace std; void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{
return;
}
if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return;
} //创建套接字
SOCKET socketClient = socket(AF_INET, SOCK_STREAM, );
//向服务器发送请求
SOCKADDR_IN sockAddrClient;
sockAddrClient.sin_addr.S_un.S_addr = inet_addr("120.77.57.44");
sockAddrClient.sin_family = AF_INET;
sockAddrClient.sin_port = htons(); if (SOCKET_ERROR == connect(socketClient, (SOCKADDR*)&sockAddrClient, sizeof(SOCKADDR)))
{
closesocket(socketClient);
WSACleanup();
return;
}
//接受信息
char recvBuf[];
recv(socketClient, recvBuf, , );
printf("%s\n", recvBuf);
//发送数据
send(socketClient, "This is lisi", strlen("This is lisi") + , );
//关闭套接字
closesocket(socketClient);
WSACleanup();
cin.get();
cin.get();
}
二.用VC++来编写UDP 服务器/客户端的简单程序。
1.服务器端:
①加载套接字库(WSAstartup)
②创建socket
③绑定socket(bind)
④接受从客户端发来的信息(recvfrom)
⑤关闭套接字(closesocket)
⑥清空套接字库(WSAClearup)
#include <iostream>
#include <stdlib.h>
#include <WinSock2.h> using namespace std; void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(,); err = WSAStartup(wVersionRequested,&wsaData);
if (err != )
{
return ;
}
if (LOBYTE(wsaData.wVersion)!= || HIBYTE(wsaData.wVersion)!=)
{
WSACleanup();
return ;
} //创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,); SOCKADDR_IN sockAddrSrv;
sockAddrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
sockAddrSrv.sin_family = AF_INET;
sockAddrSrv.sin_port = htons();
//绑定套接字
bind(sockSrv,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR)); SOCKADDR_IN sockAddrClient;
int len = sizeof(SOCKADDR);
char recvBuf[];
//接受客户端信息
recvfrom(sockSrv,recvBuf,,,(SOCKADDR*)&sockAddrClient,&len);
printf("%s\n",recvBuf); //关闭套接字
closesocket(sockSrv);
//清除套接字库
WSACleanup();
cin.get();
cin.get();
}
2.客户端:
①加载套接字库 (WSAstartup)
②创建socket
③发送数据(sendto)
④关闭套接字(closesocket)
⑤清空套接字库(WSAClearup)
#include <iostream>
#include <stdlib.h>
#include <WinSock2.h> using namespace std; void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(,); err = WSAStartup(wVersionRequested,&wsaData);
if (err != )
{
return ;
}
if (LOBYTE(wsaData.wVersion)!= || HIBYTE(wsaData.wVersion)!=)
{
WSACleanup();
return ;
}
//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,); SOCKADDR_IN sockAddrSrv;
sockAddrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockAddrSrv.sin_family = AF_INET;
sockAddrSrv.sin_port = htons(); //char sendBuf[100];
sendto(sockClient,"Hello",strlen("Hello")+,,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
cin.get();
cin.get();
}
孙鑫 VC++深入详解第14课——TCP通信/UDP通信(转)的更多相关文章
- 孙鑫视频VC++深入详解学习笔记
孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...
- 孙鑫VC++视频教程(1-20课全)
孙鑫VC++视频教程(1-20课全)PPT讲义和源代码 http://down.51cto.com/data/467760 孙鑫VC++从入门到精通开发详解视频教程[20讲] http://down. ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- VC++深入详解-第五章学习心得
这一章节主要讲解了文本相关的一些编程 插入符的使用 CreateSolidCaret(100,200);//插入符的宽度和高度 ShowCaret(); 插入符的一般使用方法 int CTestVie ...
- 《VC++ 深入详解》 第3版 这是盗版书么~。。。
<VC++ 深入详解> 第3版 www.broadview.com.cn 书读到一小半,发现书重复了一部分,缺失一部分.... 难受~ 比较难继续下去了 有一样的小伙伴么~ <VC+ ...
- 《TCP-IP详解卷3:TCP 事务协议、HTTP、NNTP和UNIX域协议》【PDF】下载
TCP-IP详解卷3:TCP 事务协议.HTTP.NNTP和UNIX域协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 ...
- VC++使用socket进行TCP、UDP通信实例总结
1. 两台计算机通信需要协议,通信的两台计算机IP必须唯一 2. 同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...
- 孙鑫VC++视频教程笔记
写在前面的话:在学习孙鑫老师的VC++视频时,为了加深自己对知识的深入理解,就做了下面的笔记. 第一讲: 第二讲: 第三讲: 第四讲: 第五讲: 第六讲: 第七讲: 第八讲: 第九讲: 第十讲: 第十 ...
- 孙鑫VC学习系列教程
教程简介 1.循序渐进 从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 -- 消息循环机制. 2.通俗易懂 编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和M ...
随机推荐
- 笔记-scrapy-Request/Response
笔记-scrapy-Request/Response 1. 简介 Scrapy使用Request和Response来爬取网站. 2. request class scrapy.http ...
- PHP代码审计3-SQL注入,CSRF,动态函数执行与匿名函数执行,unserialize 反序列化漏洞,变量覆盖,文件管理,文件上传
SQL注入 审计语句 [输入参数] SELECT,DELETE,UPDATE,INSERT 防御 转义: 1.开启gpc:判断解析用户提示的数据 2.mysql_real_escape_string( ...
- SpringMVC---四大注解
SpringMVC四大注解 Component 通用标注,在不清楚使用哪个注解的时候,可以使用Component通用注解 Controller 标注web请求控制器 Service 标注Service ...
- java跨服务器请求url获得数据
在项目中,有时需要通过请求远程服务器上的url获取数据(前提是程序所在服务器可以和url服务器ping成功), 用java在后台发送请求时,用到了java.net.URL, java.net.URLC ...
- python学习笔记二:流程控制
一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...
- 【Java】Java JDK 安装及环境配置
安装包下载: Java Platform (JDK) 11 https://www.oracle.com/technetwork/java/javase/downloads/index.html 安装 ...
- CentOS 7.5 部署蓝鲸运维平台
环境准备 官方建议 准备至少3台 CentOS 7 以上操作系统的机器 最低配置:2核4G 建议配置: 4核12G 以上 部署前关闭待安装主机之间防火墙,保证蓝鲸主机之间通信无碍 部署前关闭SELin ...
- 第一天docker入门
[01 入门] docker 最核心为三部分组成 镜像,仓库和容器 镜像:一个只读的模板 仓库:代码仓库,镜像的集合 容器:镜像的实例化进程 我们可以这样理解 容器就是一个沙箱,docker利用容器运 ...
- PHP如何实现第三方分享
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- php数组循环的三种方式
PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ...