//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. php实现大文件上传带进度条

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  2. luogu 2698 [USACO12MAR]花盆Flowerpot 单调队列

    刷水~ Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...

  3. 【CF1247E】Rock Is Push(DP,二分)

    题意:有一个n*m的方格,每一格可能为空也可能有石头,要从(1,1)走到(n,m),每次可以往右或往下走 每次走的时候都会将自己面前的所有石头向移动方向推一格,如果碰到了边界就推不过去 问方案数模1e ...

  4. layer 弹出层不能居中

    $("#btnAdd").button("loading"); parent.layer.open({ title: '添加菜单', type: 2, maxm ...

  5. React-Native 之 GD (十一)加载更多功能完善 及 跳转详情页

    1.加载更多功能完善 GDHome.js /** * 首页 */ import React, { Component } from 'react'; import { StyleSheet, Text ...

  6. mvn 与 pom.xml

    mvn 安装 wget http://mirrors.hust.edu.cn/apache//maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.t ...

  7. Java 八大基本数据类型

    相关信息获取: (1)最小值:包装类.MIN_VALUE,如 Integer.MIN_VALUE (2)最大值:包装类.MAX_VALUE,如 Integer.MAX_VALUE (3)二进制位数:包 ...

  8. Map m=new HashMap()

    Map<String,String> m=new HashMap<String,String>() 等于 HashMap<String,String> hashMa ...

  9. mysql新建表

    CREATE TABLE table( id int(20) not null auto_increment primary key, //auto_increment当为空时自动补全,注意,类型应该 ...

  10. Java ——数组 选择排序 冒泡排序

    本节重点思维导图 数组 public static void main(String[] args) { int a ; a=3; int[] b; b = new int[3];//强制开辟内存空间 ...