Winsock编程基础2(Winsock编程流程)
//创建套接字
SOCKET socket(
int af, //指定套接字使用的地址格式,Winsock只支持AF_INET
int type, //套接字类型
int protocol//配合type使用,使用的协议
);
//---type
/*
* SOCKET_STREAM 流套接字,TCP
* SOCKET_DGRAM 数据报套接字UDP
* SOCK_RAW 原始套接字
*/
//type使用上面两种时,protocol可直接赋0
//创建失败返回 INVALID_SOCKET(-1),可通过WSAGetLastError获得错误代码
//也可以使用WSASocket创建套接字,现在先不讨论 //关闭套接字
int closesocket(SOCKET s); //s为要关闭套接字句柄
int bind(
SOCKE s, //套接字句柄
const struct socketaddr* name, //要关联的本地地址
int nameLen //地址长度
);
//bind作用在没有建立连接的套接字上 //绑定示例
//填充sockaddr_in结构
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(); //为0时主机也会自动配置
addr.sin_addr.S_un.S_addr = INADDR_ANY; //自动使用当前主机配置
//绑定这个套接字到一个本地地址
if(bind(sListen, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)//sListen是一个套接字
{
cout << "Failed bind()" << endl;
return ;
}
int listen(
SOCKET s, //套接字句柄
int backlog //监听队列中允许保持的尚未处理的最大连接数,队满客户端会收到WSAECONNREFUSED
);
4、接受连接请求
SOCKET accept( //返回实际连接的套接字,与s有相同属性
SOCKET s,
struct sockaddr* addr, //指向sockassr_in结构指针,用于获得对方信息
int *addrLen //指向地址长度指针
);
5、客户端创建套接字后的请求与服务器连接
int connect(
SOCKET s, //客户端套接字
const struct sockaddr FAR *name, //包含了要连接的服务器的地址信息
int nameLen
);
6、收发数据
int send(
SOCKET s, //
const char FAR *buf, //要发送的数据缓冲区地址
int Len, //缓冲区长度
int flags //调用方式,常设0
);
int recv(SOCKET s, char FAR *buf, int len, int flags)
简单实例
//服务器端
#include <iostream>
#include <stdio.h> #include "InitSock.h" using namespace std;
int main(void)
{
CInitSock initSock;
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
cout << "Failed socke()" << endl;
return ;
}
//填充sockaddr_in结构
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
addr.sin_addr.S_un.S_addr = INADDR_ANY;
//绑定这个套接字到一个本地地址
if (bind(sListen, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
{
cout << "Failed bind()" << endl;
return ;
} //进入监听模式
if (listen(sListen, ) == SOCKET_ERROR)
{
cout << "Failed listen()" << endl;
return ;
} //循环接受客户端连接请求
sockaddr_in remoteAddr; //远程客户端信息
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
char szText[] = "TCP Sever Demo!\r\n";
while (true)
{//接受新连接
sClient = accept(sListen, (SOCKADDR *)&remoteAddr, &nAddrLen);
if (sClient == INVALID_SOCKET)
{
cout << "Failed accept()" << endl;
continue;
} cout << "接受一个连接: " << inet_ntoa(remoteAddr.sin_addr) <<endl;; //inet_ntoa()实际已过时,只能处理IPv4
//向客户端发送数据
send(sClient, szText, strlen(szText), );
//关闭通客户端的连接
closesocket(sClient);
}
//关闭监听套接字
closesocket(sListen);
return ;
}
客户端
#include <iostream>
#include <stdio.h> #include "InitSock.h" using namespace std;
int main(void)
{
CInitSock initSock;
//创建套接字
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
cout << "Failed socke()" << endl;
return ;
}
//也可以在这里调用binding函数绑定一个本地连接
//否则系统会自动安装
//...
//填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons();
servAddr.sin_addr.S_un.S_addr = INADDR_ANY; //注意这里要填写远程服务器的TCP地址
//本地回环127.0.0.1
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -)
{
cout << "Failed connect()" << endl;
return ;
} //接受数据
char buff[];
int nRecv = recv(s, buff, , );
if (nRecv > )
{
buff[nRecv] = '\0';
cout << buff << endl;
}
//关闭套接字
closesocket(s);
getchar();
return ;
}
Winsock编程基础2(Winsock编程流程)的更多相关文章
- Spark编程基础_RDD初级编程
摘要:Spark编程基础_RDD初级编程 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...
- 网络编程基础之TCP编程学习(一)
网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...
- Winsock编程基础2(UDP流程)
UDP用户数据报协议 服务器端 <1 创建套接字(socket) <2 绑定IP地址和端口(bind) <3 收发数据(sendto, recvfrom) <4 关闭连接(cl ...
- 第1章 网络编程基础(2)——Socket编程原理
Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...
- 【C编程基础】多线程编程
基础知识 1.基本概念 (1)线程,即轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位. (2)线程同步 ...
- java网络编程基础——TCP网络编程三
AIO实现非阻塞通信 java7 NIO2 提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO被称为异步IO(Asynchronous IO) ...
- java网络编程基础——TCP网络编程二
1.半关闭的Socket 前面的服务器和客户端通信时总是以行为最小数据单位,但是在某些协议里,通信的数据单位可能是多行的,当出现多行数据时就 出现一个问题:Socket输出流如何表示输出数据已经结束. ...
- IOS学习之十七:Grand Central Dispatch(GCD)编程基础
IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...
- Java并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
随机推荐
- CentOs7.5安装PostgreSQL11
前言 本章介绍在CentOs上安装一个PostgreSQL数据库 下一篇可能是安装 Redis 本篇使用的服务器是已经安装过Python/Nginx等常用软件的环境,因此在安装过程中可能会遇到按照本章 ...
- JQuery ajax 前后端传值介绍
https://jingyan.baidu.com/album/ca41422f0bf08e1eae99ed04.html?picindex=5 现在我们话不多说,开始仔细讲解一下我们ajax内部传递 ...
- python Django2.X,报错 ‘learning_logs ’is not a registered namespace,如何解决?
自己也查阅了自己出现了的问题,其中就有这么个按照书中来写的代码但是Django却是提示了 ‘learning_logs ’is not a registered namespace. 然后错误提示可 ...
- Python学习笔记十二
HTML全称:Hyper Text Markup Language超文本标记语言 不是编程语言 HTML使用标记标签来描述网页 2. HTML标签 开始标签,结束标签. 例如:<html&g ...
- Asp.net并发请求导致的数据重复插入问题
前段时间工作中,有客户反应了系统中某类待办重复出现两次的情况.我核实了数据之后,分析认为是并发请求下导致的数据不一致性问题,并做了重现.其实这并不是一个需要频繁调用的功能,但是客户连续点击了两次,导致 ...
- 使用chrome-devtools定位元素
2.1使用chrome-devtools 这是谷歌提供的一个移动端Web开发调试工具,通过它我们可以调试手机页面.通过调试我们可以看到wap页面的源码,从而进行元素的定位.那么这个工具该如何使用呢?首 ...
- 随笔【js】
1.js是大小写敏感的 2. 区别 getElementBy ID , getElementsBy Name, getElementsBy TagName以人来举例说明,人有能标识身份的身份证,有姓 ...
- FFT快速傅里叶变换算法
1.FFT算法概要: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换 ...
- python基础day2
一.python字符串 字符串是 Python 中最常用的数据类型.可以使用引号('或")来创建字符串 1.1Python访问字符串中的值 Python不支持单字符类型,单字符在 Pytho ...
- 网络对抗技术 20165220 Exp3 免杀原理与实践
实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧: 2 通过组合应用各种技术实现恶意代码免杀(1 ...