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. C# 7.0特性

    一.out的形参变量无需再提前声明 befor: "; int numericResult; if (int.TryParse(input, out numericResult)) Cons ...

  2. android app 的插件化、组件化、模块化开发-2

    Android 插件化 ——指将一个程序划分为不同的部分,比如一般 App的皮肤样式就可以看成一个插件 Android 组件化 ——这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指 ...

  3. CF1029A Many Equal Substrings

    题目描述 你有一个字符串t,它由n个字母组成. 定义一个字符串s的子串为s[l...r],表示从位置l到r构成的一个新的串. 你的目标是构造一个字符串s,使得它的可能长度最小,要求s中存在k个位置i, ...

  4. 一丶HTML介绍

    import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('local ...

  5. 物化视图(materialized view) 实现数据迁移、数据定时同步

    近日公司有一个9i 的Oracle数据库,运行效率低下.想要将其升级到11G. 但是升级之前 要将数据进行同步,好在表不是很多.只有三张表.业务压力也不大,就想到了使用物 化视图的方式将数据同步过来. ...

  6. Django by example -----1总结

    根据django by example 完成了第一个例子,总结如下. 第一: django的orm真的很方便,避免了sql语句的使用,你所需要的,django基本都已经封装好了,一些字段很有意思. 第 ...

  7. maven问题解决:提示maven依赖包缺失,但是去文件夹下找确实有这个包

    出现问题:提示maven依赖包缺失,但是去文件夹下找确实有这个包. (我的操作就是:删除文件夹中的jar.重新update,) 搞了好多遍,工具总是提示错误信息,没办法,请求大神 操作大概过程: 1  ...

  8. QMainWindow

    QMainWindow继承自QWidget,是一个顶层窗口,它可以包含其他的界面元素:菜单栏.工具栏.状态栏.子窗口等. QMainWindow不能设置布局(setLayout()方法),因为它有自己 ...

  9. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  10. eclipse快速配置spring相关xml文件头信息

    通过spring tools 插件工具来快速配置xml头信息 ctrl +n 创建-----------> 输入spring 选中spring Beann Configuration File ...