//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 ;
}

最新文章

  1. JSON.stringify()
  2. Java语法基础(三)----选择结构的if语句、switch语句
  3. HttpClient实现客户端与服务器的通信
  4. Android-图片按钮汇总
  5. css权重及优先级问题
  6. TF-IDF算法扫盲2
  7. javascript中for-in的用法
  8. 食品药检所LIMS需求分析说明书
  9. 数学(矩阵乘法,随机化算法):POJ 3318 Matrix Multiplication
  10. 【原创】贴片电容的测量方法。。。这是我从自己QQ空间转过来的,本人实操!
  11. UILabel自适应高度,自动换行
  12. SQL常用语句集合(不断更新)
  13. C#和Java中执行SQL文件脚本的代码(非常有用)
  14. Frame框架
  15. 面向接口编程实现不改代码实现Redis单机/集群之间的切换
  16. JAVA面向对象-----值交换(基本数据类型 数组类型 对象的值 字符串的)
  17. 我的 FPGA 学习历程(07)—— BCD 编码:移位加 3 算法
  18. Hadoop集群启动
  19. 正在执行的sql
  20. linux常用命令:chkconfig 命令

热门文章

  1. 自己动手实现一个网络模型 python
  2. HDU-6703 array
  3. PHP导出excel文件名中文IE乱码解决
  4. BZOJ 1029 建筑抢修(贪心堆)
  5. ionic打包app——以安卓版本为例 辛苦之路~~~
  6. canvas介绍(画布)
  7. React-Native 之 GD (四)使用通知方式隐藏或显示TabBar
  8. python json字符串中有int类型数字(不带引号)
  9. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_7_可变参数
  10. 关于一段有趣代码引出的String创建对象的解释