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实例的更多相关文章

  1. [19/04/15-星期一] 基于Socket(套接字)的TCP和UDP通讯的实现

    一.TCP 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序, 简称服务器.一旦通讯建立,则客户端和 ...

  2. Linux 套接字编程 - TCP连接基础

    第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...

  3. 基于socketserver模块实现并发的套接字(tcp、udp)

    tcp服务端:import socketserver class MyHandler(socketserver.BaseRequestHandler): def handle(self): #通信循环 ...

  4. 02_套接字编程(socket抽象层)

    1.套接字概述 1.套接概述: 套接是进行网络通信的一种手段(socket) 2.套接字分类:         流式套接字(SOCK_STREAM): 传输层基于tcp协议进行通信         数 ...

  5. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  6. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  7. 【UNIX网络编程(四)】TCP套接字编程具体分析

    引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...

  8. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  9. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

随机推荐

  1. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  2. 使用JavaMail发送邮件

    一.邮件的相关概念 邮件协议.主要包括: SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件 POP3协议:Post Office Prot ...

  3. JS和JSON的区别

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON格式的数据,主要是为了跨平台交流数据用的.但JSON和JavaScript确实存在渊源,可以说这种数 ...

  4. css动画

    阅读目录 css3中与动画相关的标签 animation transition 与动画无关的transform 浏览器兼容 css3中与动画相关的标签 1.animation标签 不同浏览器的动画属性 ...

  5. tomcat 8.5.9.0 解决catalina.out过大的问题

    先吐嘈一下tomcat这个项目,日志切割这么常见的功能,tomcat这种知名开源项目默认居然不开启,生产环境跑不了几天,磁盘就满了,而且很多网上流传的方法,比如修改conf/logging.prope ...

  6. 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1

    在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.Ne ...

  7. jQuery Mockjax插件使用心得

    最近指导前端攻城狮在后台代码没有完成前测试自己写的后台代码,第一个版本是让他直接创建一个data.json静态数据,然后再ajax调用,缺点非常明显,首先需要localhost的支持,其次是能测的功能 ...

  8. 手机端html5触屏事件(touch事件)

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  9. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  10. 个人理解c#对称加密 非对称加密 散列算法的应用场景

    c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...