//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)的更多相关文章

  1. win32 socket 编程(三)——TCP/IP

    一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...

  2. win32 socket 编程(一)——TCP/IP

    一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时, ...

  3. win32 socket编程(二)——TCP/IP

    一.大端.小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. (主机字节顺序) 1.2 大端法(Big-Endian ...

  4. 27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器

    本文就是在windows下进行socket编程,搭建一个TCP客户端. 在visual studio下编程,首先在windows下进行初始化(这点在linux下是不需要的): /* 初始化 Winso ...

  5. win32 socket 编程(六)——UDP

    基于 UDP 无连接的 socket 编程 一.服务器端操作流程 1.1加载套接字库(WSAStartup) 1.2 创建套接字  (socket) 1.3将创建的套接字绑定到一个本地地址和端口上   ...

  6. python socket编程实现的简单tcp迭代server

    与c/c++ socket编程对照见http://blog.csdn.net/aspnet_lyc/article/details/38946915 server: import socket POR ...

  7. win32 socket编程(五)——客户端实例(TCP)

    一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...

  8. 网络编程----------SOCKET编程实现简单的TCP协议

    首先我们须要大致了解TCP的几点知识: 1.TCP的特点:面向连接的可靠性传输 2.TCP的三次握手建立连接和四次挥手释放连接.但为什么TCP要三次握手建立连接呢? 答:由于两次握手无法保证可靠性.若 ...

  9. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

随机推荐

  1. 用PL/SQL登录显示 “无法解析指定标识符”

    错误现象: 为了看表空间是否完整建好,打开相应的连接工具plsql,但是打不开,显示  “无法解析指定标识符”: 处理方式: 首先点击取消直接登录,打开工具---->首选项,在路径上看指定好没有 ...

  2. 【JavaScript】 命名空间污染解决

    闭包解决命名空间污染问题 var init = (function () { var name = "zhangsan", age = 12, sex = "male&q ...

  3. 浙大PAT CCCC L3-015 球队“食物链” ( 搜索 && 剪枝 )

    题目链接 题意 : 有 n 个球队,给出主客场胜负图,找出一个序列 1.2.3..... 使得 1 战胜过 2 .2 战胜过 3.3 战胜过 4..... n 战胜过 1 ( 这个序列是 1~n 的其 ...

  4. Java——super

    在Java类中使用super来引用基类的成分.   [代码]  

  5. PHPExcel组件编程spl_autoload_register

    E:\html\tproject\framework\modules\common\vendor\PHPExcel\Classes\PHPExcel.php <?php /** PHPExcel ...

  6. Oracle诊断: 服务器启后,无法连接

    Oracle 服务器启后,使用Toad 客户端连接oracle 时候,遇到下面的错误: oracle ORA-12514: TNS: no listener TNS: listener does no ...

  7. Apache2.4+PHP7.2环境搭建

    Editplus生成码:http://www.jb51.net/tools/editplus/ 阿帕奇下载地址:https://www.apachehaus.com/cgi-bin/download. ...

  8. 与Pig相似,Hive是一种MapReduce上的抽象工具(除非使用新的执行引擎)

    Hive隐藏了后面的MapReduce任务 EXPLAIN sql: 分析查询计划.

  9. MongoDB--(NoSQL)入门介绍

    NoSQL中比较优秀的产品 windows 下载安装 shell 基本操作(javascript 引擎) BSON扩充的数据类型(JSON的扩展,浮点型,日期型的扩充) step1.创建数据库 use ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_1_并发与并行

    并发,相当于 一个人吃两个馒头,吃一口这个再吃一口另外一个.这里是cpu一会执行任务1,一会又执行任务2 并行,相当于两个人 吃两个馒头,各自吃各自的,这样速度就会快