C++ Socket编程步骤

 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

第一式: 加载/释放Winsock库:

1.加载方法:

WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
    return;   //代表失败
}

2.释放方法:

WSACleanup();

第二式: 构造SOCKET:

1.服务端:构造监听SOCKET,流式SOCKET.
   SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

2.客户端:构造通讯SOCKET,流式SOCKET.
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

第三式:配置监听地址和端口:

1.服务端: SOCKADDR_IN serverAddr
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_port = htons(1234);           /*本地监听端口:1234*/
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

第四式:   绑定SOCKET:

1.服务端:绑定监听SOCKET.
  bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

第五式: 服务端/客户端连接:

1.服务端:等待客户端接入.
   SOCKET Command_Sock = accept(Listen_Sock, ...)

2.客户端:请求与服务端连接.
int ret = connect(Client_Sock, ...)

第六式: 收/发数据:

1.服务端:等待客户端接入.char buf[1024].
    接收数据:recv(Command_Sock,buf, ...)

    发送数据:send(Command_Sock,buf, ...)

2.客户端:请求与服务端连接.char buf[1024].
    发送数据:send(Client_Sock,buf, ...)

    接收数据:recv(Client_Sock,buf, ...)

第七式: 关闭SOCKET:

1.服务端:关闭SOCKET.
   closesocket(Listen_Sock)
closesocket(Command_Sock)

2.客户端:关闭SOCKET.
closesocket(Client_Sock)

#include <stdio.h>
#include <Winsock2.h>
void main()
{
 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;
 }
 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
  
 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
 listen(sockSrv,5);
 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);
 while(1)
 {
  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  char sendBuf[50];
  sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);
  char recvBuf[50];
  recv(sockConn,recvBuf,50,0);
  printf("%s\n",recvBuf);
  closesocket(sockConn);
 }
}
复制代码
#include <stdio.h> #include <Winsock2.h> void main() {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;}SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));send(sockClient,"hello",strlen("hello")+1,0);char recvBuf[50];recv(sockClient,recvBuf,50,0);printf("%s\n",recvBuf);closesocket(sockClient);WSACleanup(); }

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

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

相关文章

python中的排序方法都有哪些_Python中的排序方法sort(),sorted(),argsort()等

Python list内置sort()方法用来排序&#xff0c;也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。 1&#xff09;排序基础 简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list&#xff0c;新的list的元素基于小于运算符(__lt__)…

javadoc maven_Maven Fluido Skin和Javadoc类图

javadoc maven我使用Maven网站已有一段时间了&#xff0c;对此我感到非常满意。 我不想在Maven 3之后更新我的项目&#xff0c;但是没关系&#xff0c;Maven 3带来了许多新奇的东西。 但是&#xff0c;有两件事使我感到烦恼&#xff1a;缺乏美观和现代的外观&#xff0c;以及浏…

Python的包管理工具

刚开始学习Python时&#xff0c;在看文档和别人的blog介绍安装包有的用easy_install, setuptools, 有的使用pip&#xff0c;distribute&#xff0c;那麽这几个工具有什么关系呢&#xff0c;看一下下面这个图就明白了 下面简单的介绍一下&#xff1a; Distribute是对标准库disu…

2018软工实践第六次作业-团队选题报告

组长博客地址&#xff1a;点击这里 选题报告内容 选题报告下载链接&#xff1a;点击下载本组评审表设计 评审表下载链接&#xff1a;点击下载评审表预览&#xff1a;NABCD 分析引用 NEED 需求 用户群体 主要针对人群&#xff1a;福州大学的广大师生群体以及食堂各个店铺用户数量…

关于vs2008上的socket链接错误问题

昨天想用socket做一个简单的windows程序, 先拿来了以前在vc6.0上做的一小段代码, 竟然发现在vs2008上不能运行.出现了好多链接错误, 研究了好半天也没有发现是怎么回事.>下来是代码和 错误信息. 正在链接...>1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__cl…

python定义变量并赋值_Python动态声明变量赋值代码实例

这篇文章主要介绍了Python动态声明变量赋值代码实例,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过exec()、globals()和locals() # 通过exec() for i in range(1, 4): # 第一次循环 i1 时,会执行字符串中的…

应用JDK 9 @不推荐使用的增强功能

我在博客文章JDK 9 Deprecated Annotation Enhancements中讨论了针对Deprecated注释的当前建议的JDK 9增强 功能 。 在本文中&#xff0c;我将更详细地介绍这些次要增强功能的建议用法&#xff0c;并说明关键的Java SE API如何已经应用了这些Deprecated增强功能。 JEP 277主页…

win7下安装pip——Python的包管理工具

很多Python的工具包的安装&#xff0c;用一个pip install ** 就可以了&#xff0c;看得我这个晕啊。。。于是搞了好几个小时&#xff0c;终于明白了pip 和easy_install、distribute 一样&#xff0c;是安装Python工具包的便捷管理工具。这几个管理工具的关系在&#xff1a;http…

MySQL中left join、right join与inner join的区别

1、数据库 1.1、作者表 1.2、图书表 1.3、出版社表 2、left join left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录。 2.1、sql语句 select * from app01_publisher left join app01_book on app01_publisher.id app01_book.publish_id 2.2、查询结果 3…

python得读音_python3 - 文本读音器

本篇分享的是使用python3制作一个文本读音器&#xff0c;简单点就是把指定的文本文字转语音说出来&#xff1b;做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候&#xff0c;可通过语音来帮助自己&#xff0c;当然如果你是小说迷&#xff0c;可以扩展成一个小说读音…

Linux下python升级步骤

首先下载源tar包 可利用linux自带下载工具wget下载&#xff0c;如下所示&#xff1a; 1 # wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz 或自己去网上找&#xff0c;这里提供一个最新版的下载链接&#xff1a;http://xiazai.zol.com.cn/detail/33/320958.sht…

windows 下安装Simplejson方法

1.下载&#xff1a;http://pypi.python.org/pypi/simplejson/ 文件为压缩文件 2.解压&#xff1a;可以直接右键&#xff1a;解压文件.例如&#xff1a;D:/simplejson 3.开始---运行---输入命令&#xff1a;cmd 4.进入到目录&#xff08;如&#xff1a;D:/simplejson&#xff09…

Vue(二十八)el-cascader 动态加载 - 省市区组件

1.后台接口为点击加载下一级 &#xff0c;传省市区id <template><el-cascaderv-model"selectedOptions"placeholder"请选择省市区":options"cascaderData"active-item-change"handleItemChange":props"{value: id,label…

用虚拟机安装了红帽后,我确实没设置用户名密码,但现在一打开就让输入用户名密码。这种情况该怎么办??

2011-05-05 15:22 提问者采纳破解root密码方法 1、在启动Linux时出现这个界面按e键。 2、按e键后出现选择界面 3、再按e键进入编辑状态。 4、用上、下键选择第二行以”kernel”开头的这一行&#xff0c;然后再按e键进入编辑状态 5、在此行的末尾&#xff0c;按空格键后输入sing…

Mongo数据库搭建

一、安装 1、首先下载Mongo程序&#xff0c;到官方网站上选择适合自己的版本下载&#xff0c;在这里我选择的win32平台下的程序包。解压之后配置相应的环境变量&#xff0c;即可在CMD命令窗口对Mongo进行操作。官方下载URL:http://www.mongodb.org/downloads 在该页面的下方有…

如何制作混合果汁?

天猫超市塞浦路斯Prima牌菠萝果汁汇源葡萄果汁 倒在一起。转载于:https://www.cnblogs.com/theodoric008/p/9792743.html

pl/postgresql_PostgreSQL PL / java简介

pl/postgresql现代数据库允许以多种语言编写存储过程。 一种常见的实现语言是java.NB&#xff0c;本文讨论了PostgreSQL特定的Java实现。 其他数据库的详细信息将有所不同&#xff0c;但概念将相同。 PL / Java的安装 在Ubuntu系统上安装PL / Java很简单。 我将首先创建一个新…

python输出文本和值_python读取文本中数据并转化为DataFrame的实例

在技术问答中看到一个这样的问题&#xff0c;感觉相对比较常见&#xff0c;就单开一篇文章写下来。 从纯文本格式文件 “file_in”中读取数据&#xff0c;格式如下&#xff1a;需要输出成“file_out”&#xff0c;格式如下&#xff1a;数据的原格式是“类别&#xff1a;内容”&…

欧拉回路与欧拉道路

图G的一个回路&#xff0c;若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。如果一个图只是形成一个连通所有节点的链&#xff0c;且每一点只走一次&#xff0c;则成为欧拉道路。具有欧拉回路或欧拉道路的图称为欧拉图&#xff08;简称E图&#xff09;。有向图的欧拉回路…

小心DLL链接静态库时的内存错误

最近写的模块&#xff0c;在独立的应用程序中测试是没问题的&#xff0c;但把它装配成DLL后&#xff0c;再在另一个应用程序中调用时却出现了内存错误。程序的模块链接关系大概是这样的&#xff1a; module就是我所写的模块&#xff0c;在这里被封装为DLL&#xff0c;因为要使用…