c++ socket学习(1.1)

本文学习相关资料:
C/C++ socket编程教程

环境:vs2015
源码:本文代码

windows 如何创建客户端与服务端通信?

TCP:

服务端

windows先告诉程序我们要使用哪个版本的winsock,成功调用了它才能继续下去

#pragma comment (lib,"ws2_32.lib")  //连接ws2_32.lib
/*
MAKEWORD(2,2)表示使用2.2版本的
WSA:Windows Socket API
Startup:启动
*/
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata)

然后是创建一个套接字:

/*
这样就创建了一个套接字了
PF_INET:表示使用ipv4
SOCK_STREAM:表示使用面向连接的数据传输方式
IPROTO_TCP:表示使用TCP协议
*/
SOCKET servSock = SOCKET(PF_INET,SOCK_STREAM, IPPROTO_TCP);

然后创建sockaddr_in,用来将上面socketip地址端口绑定

/*
sockaddr_in 是一个结构体
sin_family:使用了ipv4地址
sin_addr.s_add:要绑定的ip地址
sin_port:要绑定的端口inet_addr():将ip地址从字符串转为整数,每个32位的ip地址都有一个对应的整数
htons():将整型变量从主机字节顺序转变成网络字节顺序
每台电脑可能由于系统或配置差异导致字节顺序不同,这时大家协商好网络字节的顺序,
在通信前先将自己的字节顺序转成网络字节顺序,再发送;
在接受到信息后再转回自己的字节顺序。*/
sockaddr_in servAddr; 
servAddr.sin_family = AF_INET;
//servAddr.sin_addr.s_add = inet_addr("127.0.0.1");
//要使用inet_pton需要包括头文件:WS2tcpip.h
//这里使用inet_pton来填写IP地址的原因是vs2015整天告诉我说inet_addr不安全
inet_pton(AF_INET,"127.0.0.1", &sockAddr.sin_addr.s_addr); //说明要监听的ip地址servAddr.sin_port = htons(9000);/*
这里第二个参数是SOCKADDR*类型的,结构和sockaddr_in类似
*///绑定
bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));

现在将端口IP地址都绑定好了,可以开始监听有没有人要连接这个端口

/*
第一个参数表示用来监听的套接字
第二个参数表示队列长度,来访问的人都在这个队列里面,等待接收
*/listen(servSock,20);

现在有客户端发来连接请求了,要怎么接受连接呢

/*
accept 取出队列的第一个连接请求
第一个参数:在listen的那个socket
第二个参数:客户端的IP地址和端口
第三个参数:SOCKADDR的大小*/
int nSize = sizeof(SOCKADDR);
socketaddr_in clnAddr;
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize)

那现在成功接受请求了,那么要怎么接收发送的数据呢?

/*
recv 接收客户端发来的数据,默认是阻塞的(也就是程序会一直等到客户端发信息来,否则不会往下执行)
第一个参数:accept时候返回的套接字
第二个参数:数据保存的地方
第三个参数:读取数据的最大长度(字节)
返回值:实际读取了多少个字节的数据
*/
int maxlen = 200;
char buf[maxlen]
int len = recv(clntSock, buf, maxlen, 0)

好了现在服务端接收到关闭的信息了,要怎么关闭呢

/*
记得都要关闭哦
CleanUp:清理
*/
closesocket(clntSock);
closesocket(servSock);
WSACleanup();

客户端

前面和服务端类似,都是需要创建套接字,说明服务端IP地址端口
记得在这前面要说明使用的socket 版本哦

SOCKET client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(sockaddr_in));
servAddr.sin_family = PF_INET;
//servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
inet_pton(AF_INET,"127.0.0.1", &servAddr.sin_addr.s_addr); //说明要监听的ip地址
servAddr.sin_port = htons(9000);

然后可以开始连接了

/*
这个和bind函数类似,只不过那个是绑定,这个连接,连接成功是返回0,否则返回-1
*/
connect(client, (sockaddr*)&servAddr, sizeof(sockaddr_in));

好的,现在客户端连接上了,是时候发送信息过去了

/*
send
第一个参数:连接成功的那个套接字
第二个参数:发送的内容
第三个参数:发送的内容长度
第四个参数:??
*/
send(client,"Hello Server",13,0);

好了,信息发过去了,我这边也要关闭了

closesocket(client);
WSACleanup();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ socket学习(1.2)

本文学习相关资料: C/C socket编程教程 环境:vs2015 源码:本文代码 windows 如何创建客户端与服务端通信? UDP: 这次就没什么客户端服务端好说了,UDP是没有无连接的 所以改叫接收端和发送端吧 接收端 …

js高级功能与高级需求、高级期待

http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html 简单练习题:http://tieba.baidu.com/p/2189347922 ---------------------- scope链 闭包 Javascript属性prototype node.js metaprogramming AMD、CMD机制 http://www.makumo.com/js-modules-amd-c…

synchronized同步锁

在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。由于我们可以通过 private…

c++ socket学习(1.3)

本文学习相关资料: C/C socket编程教程 环境:vs2015 源码:本文代码 在这里c socket学习(1.1)学到了怎么样建立TCP,然后通过TCP连接发送、接收信息。 但是都是一次性的,当时是接收信息后就结束…

一个一线城市的IT白领的生活成本:3万/年

自从大学毕业,经济独立,就开始全面统计各种生活开支。仔细的去统计下,发现开销还是挺大的。 定理:开销越大,就意味着你每个月的收入必须越高。 三族鼎立节余族: 收入-开支 > 0月光族:收入-开支 0透支族…

android 编译共享ccache的缓存

1. android自带的ccache版本号(2.4版本号)过低,是无法支持以上的功能的,须要使用新版ccache。2. 最新的ccache请到http://ccache.samba.org/download.html下载3. 下载解压之后,在linux底下进入ccache文件夹,执行:./configure./mak…

一位软件工程师的6年总结

作者:成晓旭 “又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经 历沉淀或者经验提炼,希望对所有的软件工…

c++ socket学习(1.4)

本文学习相关资料: C/C socket编程教程 环境:vs2015 源码:本文代码 前面学到了TCP怎么循环发包,但是TCP连接的话会出现一个问题粘包。 TCP连接接收到的数据并不是马上读取到内存里面的,而是放在缓冲区,让…

mongodb中分页显示数据集的学习

mongodb中分页显示数据集的学习 这次继续看mongodb中的分页。首先依然是插入数据: 1) db.Blog.insert( { name : "Denis", age : 20, city : "Princeton" } ) db.Blog.insert( { name : "Abe", age : 30, city : &quo…

学习编程,英语很重要!!

学会编程,可能不需要英语多好,但是学号编程,英语真的很重要!!! 好多文档,demo全是英文的,蛋疼,应许需要学习!!!转载于:https://www.cn…

c++ socket学习(1.5)

本文学习相关资料: C/C socket编程教程 环境:vs2015 源码:本文代码 这次来试一下使用TCP来传输文件,其实传输数据和差不多,就是多一个读取文件,和一个写文件而已。 服务端 int readlan 100; std::ifst…

matlab生成HEX文件-任意信号 大于64K长度

HEX文件格式不赘述,写里直接放上代码。请批评改正。 1 %%convert a signal data into hex file format2 % data format:16bit 3 % signal length: less than 2^24-14 % author: Yang Li yangli0534gmail.com5 % data:2015.01.276 7 clear all;8 close all;9 clc; 10…

移动端网页中ViewPort的使用

<meta name"viewport" content"widthdevice-width,target-densitydpihigh-dpi, initial-scale1.0, minimum-scale1.0, maximum-scale1.0, user-scalableno"> <meta name”viewport” content”widthdevice-width, initial-scale1.0, user-scalabl…

c++ socket学习(1.6)

本文学习相关资料&#xff1a; C/C socket编程教程 环境&#xff1a;vs2015 源码&#xff1a;本文代码 这次来看看UDP 之前在c socket学习&#xff08;1.2&#xff09;讲过UDP怎么发送了&#xff0c;那现在来做一个可以一直发送的。 这次没有什么接收端和发送端了&#xff0…

redis学习笔记——(1)

1. NoSQL&Redis介绍 NoSQL&#xff0c;Not Only SQL&#xff0c;是非关系型的数据库。传统的关系数据库不能满足超大规模和高并发的应用。 是以Key-Value的形式存储&#xff0c;&#xff08;例如JSON,XML&#xff09;&#xff0c;不一定遵循传统数据库的一些基本要求&#…

命令模式坚决svn树冲突(local unversioned, incoming add upon update)

当工作目录修改删除过时更新使用svn更新就容易发生树冲突“Tree Confilict”.会出现类似提示。 local unversioned, incoming add upon update1local unversioned,incoming add upon update如果使用图形化客户端可以通过对比文件和解决冲突按钮进行解决&#xff0c; 如果是使用…

c++ vector学习

参考资料&#xff1a; cppreference.com 本文代码&#xff1a; 本文源码 目录隐式成员函数1.operator &#xff08;赋值给容器&#xff09;2.assign &#xff08;将值赋给容器&#xff09;元素访问3.at &#xff08;访问指定元素&#xff0c;进行下标检查&#xff09;4.operat…

linux关闭声音

对于CentOS/Redhat/RHEL/Fedora系统&#xff0c;使用root身份执行&#xff1a;echo "alias pcspkr off" >> /etc/modprobe.conf转载于:https://www.cnblogs.com/keethebest/p/3434821.html

Bundle Identifier

Bundle Identifier : 产品的唯一标识符 1.在模拟器上面&#xff0c;只能有一个唯一的标识符的应用程序 2.在AppStore上&#xff0c;所有的应用程序的Bundler ID都是唯一的 Bundle ID 公司的反向域名 产品名 Bundle ID 不支持中文&#xff0c;因此如果是上架产品&#xff0c;需…

c++ array学习

参考资料&#xff1a; cppreference.com 本文代码&#xff1a; 本文源码 array和vector的区别是array是和C中的数组类似&#xff0c;不能动态改变数组大小&#xff0c;所以会比vector少很多函数。 目录隐式定义的成员函数1.operator &#xff08;将另一个容器拷贝过来&#x…