win32 socket编程(四)——服务器端实例(TCP)
//Server服务器端Server.cpp
1 // 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <winsock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
WORD wVersion;
WSADATA wsaData;
int er;
//1.初始化版本信息
wVersion = MAKEWORD(, );
//加载套接字库
er = WSAStartup(wVersion, &wsaData);
if (er != )
{
return -;
}
//检测套接字版本信息
if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return -;
} //2.创建服务器端套接字
SOCKET sockSer = socket(AF_INET, SOCK_STREAM, );
/*
原型:SOCKET socket(int af,int type,int protocol)
参数:
af: 代表网络地址族,目前只有一种取值有效,即 AF_INET, 代表 internet 地址族。
type: 代表网络协议类型, SOCK_DGRAM 代表 UDP 协议, SOCK_STREAM 代表 TCP 协议。
protocol: 指定网络地址族特殊协议,目前无用,赋值0即可。
*/
//3.绑定套接字
/*
nt bind( SOCKET s,const struct sockaddr FAR *name,int namelen);
参 数:
s:被绑定的套接字
name: 是一个sockaddr结构指针,该结构中包含了要绑定的地址和端口。
namelen:第二个参数name 的长度;
如果使用者不在意地址或端口的值,那么可以设定地址为 INADDR_ANY,及 Port 为 0。
对于多接口主机使用INADDR_ANY指定了一个通配地址,让该主机的任何一个IP地址都匹配。
*/
SOCKADDR_IN addr_in;
addr_in.sin_family = AF_INET;//地址族
addr_in.sin_port = htons();//端口
addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//IP
bind(sockSer, (sockaddr*)&addr_in, sizeof(addr_in)); //4.监听套接字,准备接受客户端发送的请求
/*
int listen(SOCKET s,int backlog );
参 数:
s:需要建立监听的 Socket;
backlog:最大连接个数;
*/
listen(sockSer, );
//5.定义结构体,接受客户端的IP及端口号
/*
SOCKET accept(SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen );
参数:
s: 监听套接字
addr:存放来连接的客户端的地址、端口信息;
addrlen:addr 的长度
*/
SOCKADDR_IN client_addr;
int len = sizeof(client_addr);
while (true)
{
//等待客户的请求
cout << "服务器等待客户端请求.........." << endl;
SOCKET socClient = accept(sockSer, (SOCKADDR*)&client_addr, &len);
char sendBuf[];
//格式化字符串
sprintf(sendBuf, "%s C++学习教程", inet_ntoa(client_addr.sin_addr));
//6.发送数据
send(socClient, sendBuf, strlen(sendBuf) + , );
/*
int send(SOCKET s, const char FAR *buf, int len, int flags);
参数:
s: 是一个已建立连接的套接字。
buf:指向一个缓冲区,该缓冲区包含将要传递的数据。
len:缓冲区的长度。
flags:收发数据方式的标识,如果不需要特殊要求可以设置为0。 调用send函数向客户端发送数据,注意这个函数使用的套接字需要使用已建立连接的那个套接字,
而不是用于监听的那个套接字。
*/
//7.接受数据
char recvBuf[];
recv(socClient, recvBuf, strlen(recvBuf) + , );
/*
int recv(SOCKET s,char FAR* buf, int len, int flags);
参数:
s:建立连接之后准备接收数据的那个套接字。
buf:指向缓冲区的指针,用来保存接收的数据。
len:缓冲区的长度。
flags:收发数据方式的标识,如果不需要特殊要求可以设置为0。
发送完数据之后还可以从客户端接收数据,这可以使用recv函数,应注意该函数的第一个参数也应该是建立连接之后的那个套接字,
并且定义一个字符数组recvBuf,用来保存接收的数据。
*/
cout << "接受到的数据:" << recvBuf << endl;
//8.关闭套接字
closesocket(socClient);
} return ;
}
win32 socket编程(四)——服务器端实例(TCP)的更多相关文章
- win32 socket 编程(三)——TCP/IP
一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...
- win32 socket 编程(一)——TCP/IP
一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时, ...
- win32 socket编程(二)——TCP/IP
一.大端.小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. (主机字节顺序) 1.2 大端法(Big-Endian ...
- 27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器
本文就是在windows下进行socket编程,搭建一个TCP客户端. 在visual studio下编程,首先在windows下进行初始化(这点在linux下是不需要的): /* 初始化 Winso ...
- win32 socket 编程(六)——UDP
基于 UDP 无连接的 socket 编程 一.服务器端操作流程 1.1加载套接字库(WSAStartup) 1.2 创建套接字 (socket) 1.3将创建的套接字绑定到一个本地地址和端口上 ...
- python socket编程实现的简单tcp迭代server
与c/c++ socket编程对照见http://blog.csdn.net/aspnet_lyc/article/details/38946915 server: import socket POR ...
- win32 socket编程(五)——客户端实例(TCP)
一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...
- 网络编程----------SOCKET编程实现简单的TCP协议
首先我们须要大致了解TCP的几点知识: 1.TCP的特点:面向连接的可靠性传输 2.TCP的三次握手建立连接和四次挥手释放连接.但为什么TCP要三次握手建立连接呢? 答:由于两次握手无法保证可靠性.若 ...
- Socket编程(4)TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
随机推荐
- React Native 之TouchableOpacity组件
使用TouchableOpacity组件 实现单击事件只需要声明onPress属性即可,其他同理,实现onPressIn,onPressOut,onLongPress constructor(prop ...
- php end()函数 语法
php end()函数 语法 作用:将数组内部指针指向最后一个元素,并返回该元素的值(如果成功).博智达 语法:end(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:如 ...
- 文件/大文件上传功能实现(JS+PHP)全过程
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- 对拍程序 x
一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...
- (42)嵌入式项目中常用到的C语言技能总结
嵌入式项目中常用到的C语言技能 1.指针 .结构体. 枚举. 联合.数组.字符串.链表七个专题 2.结构体指针.结构体的多重嵌套[结构体中嵌套结构体.结构体中嵌套枚举.联合体.结构体中嵌套函数指针.一 ...
- Spring Cloud架构教程 (四)服务网关(路由配置)
传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由. 没有Eureka和Consul的服 ...
- springBoot项目常用maven依赖以及依赖说明
springBoot项目常用maven依赖以及依赖说明 1:maven-compiler-plugin <build> <plugins> <!-- 指定maven编译的 ...
- 局域网IP耗尽
w 大量的vm 大量的实例 动态修改 mac
- DesignWare I2C模块的验证
I2C通信协议主要同一块板上芯片间的通信,因此速度不是很高.SCL为时钟线,SDA为数据线.时钟由主设备发送给从设备,数据可以在两设备间互传. 在测试DW_I2C模块时,如果外面都包了一层,在tb中只 ...
- Linux_ISCSI服务器
目录 目录 网络存储 ISCSI How to setup ISCSI server SCSI Commands Server Side Client Side Edit the ISCSI conf ...