1、套接字的创建和关闭

//创建套接字
SOCKET socket(
int af, //指定套接字使用的地址格式,Winsock只支持AF_INET
int type, //套接字类型
int protocol//配合type使用,使用的协议
);
//---type
/*
* SOCKET_STREAM 流套接字,TCP
* SOCKET_DGRAM 数据报套接字UDP
* SOCK_RAW 原始套接字
*/
//type使用上面两种时,protocol可直接赋0
//创建失败返回 INVALID_SOCKET(-1),可通过WSAGetLastError获得错误代码
//也可以使用WSASocket创建套接字,现在先不讨论 //关闭套接字
int closesocket(SOCKET s); //s为要关闭套接字句柄
 2、绑定IP和端口号
int bind(
SOCKE s, //套接字句柄
const struct socketaddr* name, //要关联的本地地址
int nameLen //地址长度
);
//bind作用在没有建立连接的套接字上 //绑定示例
//填充sockaddr_in结构
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(); //为0时主机也会自动配置
addr.sin_addr.S_un.S_addr = INADDR_ANY; //自动使用当前主机配置
//绑定这个套接字到一个本地地址
if(bind(sListen, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)//sListen是一个套接字
{
cout << "Failed bind()" << endl;
return ;
}
 3、设置套接字进入监听状态

int listen(
SOCKET s, //套接字句柄
int backlog //监听队列中允许保持的尚未处理的最大连接数,队满客户端会收到WSAECONNREFUSED
);

4、接受连接请求

SOCKET accept(        //返回实际连接的套接字,与s有相同属性
SOCKET s,
struct sockaddr* addr, //指向sockassr_in结构指针,用于获得对方信息
int *addrLen //指向地址长度指针
);

5、客户端创建套接字后的请求与服务器连接

int connect(
SOCKET s, //客户端套接字
const struct sockaddr FAR *name, //包含了要连接的服务器的地址信息
int nameLen
);

6、收发数据

int send(
SOCKET s, //
const char FAR *buf, //要发送的数据缓冲区地址
int Len, //缓冲区长度
int flags //调用方式,常设0
);
int recv(SOCKET s, char FAR *buf, int len, int flags)

简单实例

//服务器端
#include <iostream>
#include <stdio.h> #include "InitSock.h" using namespace std;
int main(void)
{
CInitSock initSock;
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
cout << "Failed socke()" << endl;
return ;
}
//填充sockaddr_in结构
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
addr.sin_addr.S_un.S_addr = INADDR_ANY;
//绑定这个套接字到一个本地地址
if (bind(sListen, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
{
cout << "Failed bind()" << endl;
return ;
} //进入监听模式
if (listen(sListen, ) == SOCKET_ERROR)
{
cout << "Failed listen()" << endl;
return ;
} //循环接受客户端连接请求
sockaddr_in remoteAddr; //远程客户端信息
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
char szText[] = "TCP Sever Demo!\r\n";
while (true)
{//接受新连接
sClient = accept(sListen, (SOCKADDR *)&remoteAddr, &nAddrLen);
if (sClient == INVALID_SOCKET)
{
cout << "Failed accept()" << endl;
continue;
} cout << "接受一个连接: " << inet_ntoa(remoteAddr.sin_addr) <<endl;; //inet_ntoa()实际已过时,只能处理IPv4
//向客户端发送数据
send(sClient, szText, strlen(szText), );
//关闭通客户端的连接
closesocket(sClient);
}
//关闭监听套接字
closesocket(sListen);
return ;
}

客户端

#include <iostream>
#include <stdio.h> #include "InitSock.h" using namespace std;
int main(void)
{
CInitSock initSock;
//创建套接字
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
cout << "Failed socke()" << endl;
return ;
}
//也可以在这里调用binding函数绑定一个本地连接
//否则系统会自动安装
//...
//填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons();
servAddr.sin_addr.S_un.S_addr = INADDR_ANY; //注意这里要填写远程服务器的TCP地址
//本地回环127.0.0.1
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -)
{
cout << "Failed connect()" << endl;
return ;
} //接受数据
char buff[];
int nRecv = recv(s, buff, , );
if (nRecv > )
{
buff[nRecv] = '\0';
cout << buff << endl;
}
//关闭套接字
closesocket(s);
getchar();
return ;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Winsock编程基础2(Winsock编程流程)的更多相关文章

  1. Spark编程基础_RDD初级编程

    摘要:Spark编程基础_RDD初级编程 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

  2. 网络编程基础之TCP编程学习(一)

    网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...

  3. Winsock编程基础2(UDP流程)

    UDP用户数据报协议 服务器端 <1 创建套接字(socket) <2 绑定IP地址和端口(bind) <3 收发数据(sendto, recvfrom) <4 关闭连接(cl ...

  4. 第1章 网络编程基础(2)——Socket编程原理

    Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...

  5. 【C编程基础】多线程编程

    基础知识 1.基本概念 (1)线程,即轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位. (2)线程同步 ...

  6. java网络编程基础——TCP网络编程三

    AIO实现非阻塞通信 java7 NIO2 提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO被称为异步IO(Asynchronous IO) ...

  7. java网络编程基础——TCP网络编程二

    1.半关闭的Socket 前面的服务器和客户端通信时总是以行为最小数据单位,但是在某些协议里,通信的数据单位可能是多行的,当出现多行数据时就 出现一个问题:Socket输出流如何表示输出数据已经结束. ...

  8. IOS学习之十七:Grand Central Dispatch(GCD)编程基础

    IOS学习之十七:Grand Central Dispatch(GCD)编程基础   有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...

  9. Java并发编程系列-(1) 并发编程基础

    1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...

  10. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

随机推荐

  1. nginx+uwsgi+django开发环境搭建

    Nginx+uWSGI+Djangoi开发环境搭建 Django简介,环境搭建 uWSGI简介,安装与配置 Nginx安装与配置 Nginx+uWSGI+Django原理解析 1.django简介,环 ...

  2. memcached单机或热备的安装部署

    一.部署准备 1.安装Java 不建议使用系统默认Open JDK版本,需要手工另行安装.JDK版本建议为1.7+,若Java已安装完毕,则无需重复安装. 安装过程如下: (1)获取JDK安装包: ( ...

  3. R语言数据类型

    R语言数据类型[转!!]Zhao-Pace  https://www.cnblogs.com/zhao441354231/p/5970544.html   R语言用来存储数据的对象包括: 向量, 因子 ...

  4. 2018-2019-2 网络对抗技术 20165328 Exp1 PC平台逆向破解

    实验目的: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getSh ...

  5. 第二次JAVA作业

    1 2 3 4

  6. TweenMax.js

    适用于移动端和现代互联网的超高性能专业级动画插件Tweenmax是GreenSock 动画平台的核心,配合其他插件 可动画CSS属性.滤镜效果. 颜色. 声音. 色彩. 帧. 饱和度. 对比度. 色调 ...

  7. Mybatis 源码学习系列

    前言 很久以前,我们学习了Java,从一个控制台的 Hello world .开始,我们进入了面向对象的世界. 然后由学习了SQL语言,可以写出SQL语句来将尘封在硬盘之下的数据库数据,展现出来. 后 ...

  8. [转] Ramda 函数库参考教程

    学习函数式编程的过程中,我接触到了 Ramda.js. 我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具. 你可能会问,Underscore 和  ...

  9. jQuery_base

  10. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第六集之补充:文本编辑器vi/vim】

    一:vi/vim的基本使用流程,掌握这三个步骤就算是入门vi或者vim.接下来的学习都是对vim命令和使用技巧的掌握,这要求各位自己去记忆.因为很少使用到某些命令,自然我们经常忘记这些命令,所以一旦忘 ...