Winsock API TCP/IP网络通信
通信流程如下:
1、Winsock库的装入、初始化
#pragma comment(lib,"WS2_32.lib")、WSAStartup()
2、套接字的创建(服务器端是监听套接字)
socket()
3、绑定套接字到指定的IP地址和端口
bind()
4、设置套接字进入监听状态(服务器端)+接受连接请求(服务器端)
listen()、accept()
5、请求与服务器连接
connect()
6、收发数据
send()、recv()
7、关闭套接字,释放Winsock库
closesocket()、WSACleanup()
详细流程如下:
服务器端代码:
- // TCPServer.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <WinSock2.h>
- #include <stdio.h>
- #pragma comment(lib,"WS2_32.lib") //包含相应库文件
- int main()
- {
- WSADATA wsaData;//结构体。(DLL库)建议版本/支持的最高版本/描述字符串/系统状态字符串/同时支持最大套接字数量
- WORD sockVersion = MAKEWORD(, );//windows socket api 版本
- ::WSAStartup(sockVersion, &wsaData); //必须首先执行。其指定了API版本,取得DLL库的详细信息
- //int a=::WSAGetLastError();//WSAStartup函数执行成功返回0,否则使用WSAGetLastError查看出错信息
- SOCKET s = ::socket(AF_INET, //套接字使用的地址格式,winSock中只能是AF_INET
- SOCK_STREAM, //指定套接字类型(SOCK_DGRAM/RAW(数据报/原始))
- IPPROTO_TCP);//使用协议类型,前一个是SOCK_STREAM/SOCK_DGRAM时可以为0。
- if (s == INVALID_SOCKET)
- {
- printf("Failed socket()\n");
- ::WSACleanup();//对应WSAStartup
- return ;
- }
- sockaddr_in sin;
- sin.sin_family = AF_INET; //地址家族(只能是AF_INET)
- sin.sin_port = htons(); //端口地址(网络字节顺序)为0时自动分配(1024~5000)
- sin.sin_addr.S_un.S_addr = INADDR_ANY;//IP地址。为INADDR_ANY自动取得本机所有IP
- if (::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)//(套接字句柄,本地地址,地址长度)
- {
- printf("Failed bind()\n");
- ::WSACleanup();
- return ;
- }
- if (::listen(s, ) == SOCKET_ERROR)//(套接字句柄,监听队列中允许保持的尚未处理的最大连接数)
- {
- printf("Failed listen()\n");
- ::WSACleanup();
- return ;
- }
- sockaddr_in remoteAddr;
- int nAddrLen = sizeof(remoteAddr);
- SOCKET client;
- char szText[] = "TCPServer!\r\n";
- while (TRUE)
- {
- client = ::accept(s, //套接字句柄
- (SOCKADDR*)&remoteAddr,//取得对方地址信息
- &nAddrLen);//指定remoteAddr空间大小,并且返回地址实际长度
- //accept接受到来的连接,为这个连接创建新的套接字,此套接字是处理实际连接的套接字
- if (client == INVALID_SOCKET)
- {
- printf("Failed accept()\n");
- continue;
- }
- printf("接收到一个链接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//inet_ntoa
- ::send(client, szText, strlen(szText), );//发送数据(套接字,数据,数据长度,调用方式(通常为0))
- ::closesocket(client);//关闭
- }
- ::closesocket(s);//关闭
- ::WSACleanup();//clean
- return ;
- }
客户机代码:
- // TCPClient.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<WinSock2.h>
- #include<stdio.h>
- #pragma comment(lib,"WS2_32.lib")
- int main()
- {
- WSADATA wsaData;
- WORD sockVerion = MAKEWORD(, );
- ::WSAStartup(sockVerion, &wsaData);
- SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (s == INVALID_SOCKET)
- {
- printf("Failed socket()\n");
- ::WSACleanup();
- return ;
- }
- sockaddr_in servAddr; //远程地址信息
- servAddr.sin_family = AF_INET;
- servAddr.sin_port = htons();
- servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//没有联网可以直接写127.0.0.1
- if (::connect(s, //套接字
- (sockaddr*)&servAddr, //远程地址信息
- sizeof(servAddr)) == -)//地址长度
- {
- printf("Failed connect()\n");
- ::WSACleanup();
- return ;
- }
- char buff[];
- int nRecv = ::recv(s, buff, , );//接收(套接字,缓冲区,长度,调用方式(通常为0))
- if (nRecv > )
- {
- buff[nRecv] = '\0';
- printf("接收到数据:%s", buff);
- }
- ::closesocket(s);
- ::WSACleanup();
- return ;
- }
Winsock API TCP/IP网络通信的更多相关文章
- QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)
引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...
- TCP/IP网络通信-数据传输
1.通过网络IP实现数据的传输. 2.服务器端代码 [ 服务端主要通过Socket类来创建一个监听等待客户端连接,服务端发送用send方法,接收用Receive方法] using System.Ne ...
- TCP/IP协议基础(转)
转自 http://www.chinaunix.net 作者:Bernardus160 发表于:2003-12-03 17:33:15 TCP/IP协议基础 -------------------- ...
- Winsock API编程介绍
相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...
- TCP/IP远程访问操作:rwho,rlogin,rcp和rsh
TCP/IP网络通信 软件 包使用远程访问 的 命令 ,这些命令首先是由UC Berkely为Arpanet开发的.它允许您远程注册到另一个 系统 中,并从一个系统复制文件到另一个系统.您能取得关于一 ...
- TCP/IP网络编程之字节序和网络字节序
一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程中的网络字节序.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流 ...
- TCP/IP网络编程之socket交互流程
一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流QQ群:580 ...
- 计算机网络通信TCP/IP协议浅析 网络发展简介(二)
本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket 分层的 ...
- 【TCP/IP】之Java socket编程API基础
Socket是Java网络编程的基础,深入学习socket对于了解tcp/ip网络通信协议很有帮助, 此文讲解Socket的基础编程.Socket用法:①.主要用在进程间,网络间通信. 文章目录如下: ...
随机推荐
- linecache
linecache是专门支持读取大文件,而且支持行式读取的函数库. linecache 预先把文件读入缓存起来,后面如果你访问该文件的话就不再从硬盘读取.对于大文件的读取效率还不错 Help on m ...
- Flash插件flashplugin-nonfree的手动更新
Debian,nonfree库里有flashplugin-nonfree,这个就是网页浏览器的Flash插件了.不过它好像不会自动更新,每次更新网页浏览器后都会提示flashplugin版本过低.但f ...
- 记一次autofac+dapper+mvc的框架搭建实践
1,环境 .net framework4.7.2,Autofac,Autofac.Mvc5,sql server 2,动机 公司项目用的是ef,之前留下代码的大哥,到处using,代码没有分层,连复用 ...
- C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明
这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...
- 解决网页出现 net::ERR_ABORTED 404 (Not Found)问题
1.在web.config配置文件中添加woff字体的MIME类型 在Web.config中的system.webServer节点添加 <staticContent> <remove ...
- 可编辑树Ztree的使用(包括对后台数据库的增删改查)
找了很多网上关于Ztree的例子和代码才搞定. 首先,关于Ztree的代码不介绍了,网上下载之后,引用下列四个文件就能使用了. 1.关于配置选项.主要通过回调函数来实现向后台发送数据,实现增删改查. ...
- 在windows10上创建ASP.NET mvc5+Memcached服务
感谢两位两位大佬: https://blog.csdn.net/l1028386804/article/details/61417166 https://www.cnblogs.com/running ...
- Android 四大组件之" ContentProvider "
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
- UPX源码分析——加壳篇
0x00 前言 UPX作为一个跨平台的著名开源压缩壳,随着Android的兴起,许多开发者和公司将其和其变种应用在.so库的加密防护中.虽然针对UPX及其变种的使用和脱壳都有教程可查,但是至少在中文网 ...
- Mac下通过 brew 安装 Apache 和 PHP
Mac 自带的是php5.6 ,这里讲一下如果要升级到php7.1需要做的. 1.安装brew https://brew.sh/(官网有提供安装命令 建议使用) ruby -e "$(cur ...