C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成TCP和UDP两种通讯模式的流程和代码分享一下,希望对大家多少能有点儿帮助,有什么说的不对的欢迎各位大神指正。
TCP
TCP是点对点的通讯模式,数据传输质量高,对于传输数据完整性要求高的情况一般用TCP,具体到vc++中,一般选用的是服务器/客户端模式,socket实现TCP通讯在服务器端一般分为以下几步:
服务器端
1.加载套接字库,加载套接字库的代码一般是固定的每次复制以下就OK。
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
2.创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(6000);
3.将套接字和IP地址和端口连接
bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定
4.将套接字设置为监听模式
listen(sockSrv,5);//设置为监听模式
5.创建链接套接字
SOCKADDR_IN sockclient;
int len=sizeof(SOCKADDR);
SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&sockclient,&len);//创建链接套接字
6.发送和接收数据给客户端
char sendBuf[100];
send(sockCon,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockCon,recvBuf,100,0);//发送\接收函数
7.关闭套接字
closesocket(sockCon);//关闭套接字
客户端
1.加载套接字库
与服务器端代码一样,直接复制就可以
2.创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sockaddr;
sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(6000);
3.套接字和IP地址和端口连接
connect(sockClient,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
4.发送接收数据给服务器
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"服务器你好",strlen("服务器你好")+1,0);
5.关闭套接字
closesocket(sockClient);
WSACleanup();
别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。
UDP
udp是面向无连接的,广播式的数据传输机制,它的实时性高,输出传输的完整性没法保证,对于一些实时性要求高,完整性要求不高的情况采用UDP。
服务器端
1.加载套接字库
啥也不说了,直接复制
2.创建udp套接字
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);//这里主要与TCP模式下该参数的区别
SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(6000);
3.将套接字和IP地址和端口绑定
bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定
4.接收数据
这里的接收函数用的是recvfrom();
5.关闭套接字
closesocket(sock);
客户端
1.加载套接字库
啥也不说了,直接复制
2.创建UDP套接字
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockaddr;
sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(6000);
3.发送数据
sendto();//发送函数也有区别的
4.关闭套接字
closesocket(sockClient);
WSACleanup();
别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。
C++ 利用socket实现TCP,UDP网络通讯的更多相关文章
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- Python的网络编程[0] -> socket[0] -> socket 与 TCP / UDP
Socket socket 简述 / socket Abstract 网络进程通信与 socket 网络中进程之间如何通信,首要解决的问题是如何唯一标识一个进程,否则通信无从谈起.在本地可以通过进程 ...
- tcp/ip网络通讯安全加密方法
tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等.但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的 ...
- Shell 脚本实现TCP/UDP协议通讯
Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
- [网络] SOCKET, TCP/UDP, HTTP, FTP
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- socket与TCP/UDP编程~
ket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
随机推荐
- Codeforces 417E Square Table(随机算法)
题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...
- 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)
作者 智晓锋 - 2014/07/14 自从斯诺登曝光美监听丑闻事件之后,我国政府就将信息安全问题上升到了国家安全的高度.基于此.国内的一家创业公司推出了智能型Android真机白盒測试以及开发辅助类 ...
- SSH公钥(public key)验证
安全的设置服务器 登陆,之前用用户名和密码登陆服务器 这样不安全 ,用SSH公钥(public key)验证 这个办法能很好的解决 登陆服务器 和安全登陆服务器 的特点: 目标: Client 免输 ...
- RHEL7虚拟机中不重启的情况下加新硬盘及扩展根分区容量
在VMware中添加一块新的5G硬盘 显示当前分区 # fdisk -l 通常在你在虚拟机中添加一块新硬盘时,你可能会看到新硬盘没有自动加载.这是因为连接到硬盘的SCSI总线需要重新扫描来使得新硬盘可 ...
- Powerdesigner中如何生成测试数据
设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...
- 项目打包 weblogic部署
工作流打包: 由于没有集成单点,配置文件要修改 将webnocas.xml内容复制覆盖 web.xml 到这里修改完毕 选择weblogic项目,右键maven install,生成.ear文 ...
- 查询语句,按照时间排序,取前N条
mysql: SELECT * from (SELECT H_TEMPERATURE,TH_TIME FROM wenshidu WHERE TH_TIME <= STR_TO_DATE(' ...
- 第五篇:web之前端之float的几种清除浮动方式
前端之float的几种清除浮动方式 前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.flo ...
- php字符串函数(1)
下面去学习一下php的字符串函数,那么怎么去看手册呢,举个例子 int strcasecmp ( string $str1 , string $str2 ) 第一个int,表示此函数返回的类型是int ...
- phpstrtotime()对于31日求上个月有问题
PHP自带的strtotime()对于31日求上个月有问题,如下: <?php $date = "2012-07-31"; $date_unix = strtotime($d ...