C++网络套接字编程TCP和UDP实例
1. 创建一个简单的SOCKET编程流程如下
面向有连接的套接字编程
服务器:
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 将套接字设定为监听模式,准备接受客户端请求(listen)
4) 等待客户端请求到来,当请求到来后,接受连接请求,返回一个新的对应于此连接的套接字(accept)
5) 用返回的套接字和客户端进行通信(send/recv);
6) 返回,等待另一个客户端请求
7) 关闭套接字
客户端:
1) 创建套接字(socket)
2) 向服务器发出连接请求(connect)
3) 和服务器进行通信(send/recv)
4) 关闭套接字
面向无连接的套接字编程
服务器:(接收端)
1) 创建套接字(socket)
2) 将套接字绑定到一个本地地址和端口上(bind)
3) 用返回的套接字和客户端进行通信(recvfrom);
4) 关闭套接字
客户端:(发送端)
1) 创建套接字(socket)
2) 向服务器发送数据(sendto
3) 关闭套接字
例如:面向有连接的套接字编程
首先在项目菜单,工程属性->VC++目录->库目录中添加 ws2_32.lib
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
注意一定包含头文件是小写的 winsock2.h 开头的w要小写,不然整死你了
客户端:
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第一步,创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0) ;
//定义套接字地址
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //获取服务器IP地址,inet_addr()将IP地址转为点分十进制的格式
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(1234);
//连接服务器
// connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)
{
//MessageBox("连接失败");
//return;
printf("error");
return 0;
}else
{
printf("success");
}
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("客户端接收到的数据:%s",recvBuf);
send(sockClient,"client send ",strlen("client send ")+1,0);
//关闭套接字
closesocket(sockClient);
//清除套接字资源
WSACleanup();
return 0;
}
服务器端:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//**********************************************************
//第二步创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//第三步:绑定套接字
//获取地址结构
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据
//htonl()将主机的无符号长整形数转换成网络字节顺序。
addrSrv.sin_family = AF_INET;
//sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET
addrSrv.sin_port = htons(6000);
//htons()将主机的无符号短整形数转换成网络字节顺序
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//监听客户端
listen(sockSrv,5);
//定义从客户端接受的地址信息
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR);
while(1)
{
//不断等待客户端的请求的到来,并接受客户端的连接请求
printf("等待客户连接n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s to wuhan",inet_ntoa(addrClient.sin_addr));
printf("发送数据n");
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
printf("等待接受数据n");
recv(sockConn,recvBuf,100,0);
printf("%sn",recvBuf);
closesocket(sockConn);
}
WSACleanup();
return 0;
}
面向无连接的套接字编程
例子:
客户端:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockSrv;
sockSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockSrv.sin_family = AF_INET ;
sockSrv.sin_port = htons(6000);
sendto(sockClient,"hello",strlen("hello")+1,0,(SOCKADDR*)&sockSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
return 0;
}
服务器:
#include "Winsock2.h"
#include "stdio.h"
int main()
{
//第一步:加载socket库函数
//**********************************************************
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//创建套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addSrv.sin_family = AF_INET ;
addSrv.sin_port = htons(6000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%sn",recvBuf);
closesocket(sockSrv);
WSACleanup();
return 0;
}
C++网络套接字编程TCP和UDP实例的更多相关文章
- [19/04/15-星期一] 基于Socket(套接字)的TCP和UDP通讯的实现
一.TCP 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序, 简称服务器.一旦通讯建立,则客户端和 ...
- Linux 套接字编程 - TCP连接基础
第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...
- 基于socketserver模块实现并发的套接字(tcp、udp)
tcp服务端:import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): #通信循环 ...
- 02_套接字编程(socket抽象层)
1.套接字概述 1.套接概述: 套接是进行网络通信的一种手段(socket) 2.套接字分类: 流式套接字(SOCK_STREAM): 传输层基于tcp协议进行通信 数 ...
- 初探网络编程--TCP套接字编程演示
今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 【UNIX网络编程(四)】TCP套接字编程具体分析
引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...
- 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程
目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
随机推荐
- RSA算法原理
一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...
- 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。
安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...
- [css]全屏背景图片设置,django加载图片路径
<head><style type="text/css"> #bg { position:fixed; top:; left:; width:100%; h ...
- 安装Appium-windows
安装Appium-windows JDK 安装JDK后设置 环境变量,把环境变量添加到你的系统PATH变量中. 变量: JAVA_HOME 值: C:\Program Files (x86)\Java ...
- Windows 10 虚拟桌面切换
从Windows 10开始,终于有了和Mac一样的虚拟桌面了.但总感觉用着非常的别扭.在Mac中,切换虚拟桌面的操作可谓方便至极:除了触控板和Magic Mouse原生的支持外,通过罗技M557/55 ...
- NGUI裁剪模型和粒子
效果预览 注:Cube上附着的绿色是我添加的粒子效果. 软件环境 NGUI 3.9.x Unity 5.1 x64 相关知识 RenderTexture RenderTexture是一种特殊的纹理,它 ...
- ubuntu-Linux系统读取USB摄像头数据(uvc)
这几天在做小车的过程中,需要用到图像采集.我想现在用的摄像头是UVC免驱的.根据国嵌的教程中有一个gspca摄像头的程序.我发现把gspca的采集程序用到uvc上时,在显示图像的时候提示没有huffm ...
- [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍
绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...
- 结构体内嵌函数指针实现C语言面向对象
结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...
- Android SharedPreferences公共类sharedhelper
SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 sharedpreference ...