通信流程如下:

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网络通信的更多相关文章

  1. QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...

  2. TCP/IP网络通信-数据传输

    1.通过网络IP实现数据的传输. 2.服务器端代码  [ 服务端主要通过Socket类来创建一个监听等待客户端连接,服务端发送用send方法,接收用Receive方法] using System.Ne ...

  3. TCP/IP协议基础(转)

    转自 http://www.chinaunix.net 作者:Bernardus160  发表于:2003-12-03 17:33:15 TCP/IP协议基础 -------------------- ...

  4. Winsock API编程介绍

    相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...

  5. TCP/IP远程访问操作:rwho,rlogin,rcp和rsh

    TCP/IP网络通信 软件 包使用远程访问 的 命令 ,这些命令首先是由UC Berkely为Arpanet开发的.它允许您远程注册到另一个 系统 中,并从一个系统复制文件到另一个系统.您能取得关于一 ...

  6. TCP/IP网络编程之字节序和网络字节序

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程中的网络字节序.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流 ...

  7. TCP/IP网络编程之socket交互流程

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流QQ群:580 ...

  8. 计算机网络通信TCP/IP协议浅析 网络发展简介(二)

    本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket   分层的 ...

  9. 【TCP/IP】之Java socket编程API基础

    Socket是Java网络编程的基础,深入学习socket对于了解tcp/ip网络通信协议很有帮助, 此文讲解Socket的基础编程.Socket用法:①.主要用在进程间,网络间通信. 文章目录如下: ...

随机推荐

  1. 分形之谢尔宾斯基(Sierpinski)三角形

    谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.也有的资料将其称之为谢尔宾斯基坟垛. 其生成过程为: 取一个 ...

  2. Dacapao 实验集(9.12 版本) 能不能给个网址?【内存分析实验】

    网址 Dacapao 实验集 引用 以前看到的文章,如果使用这个基准程序,引用文献很多时候是一篇论文: Blackburn S M, Garner R, Hoffmann C, et al. The ...

  3. adb错误 - INSTALL_FAILED_NO_MATCHING_ABIS

    #背景 换组啦,去了UC国际浏览器,被拥抱变化了.还在熟悉阶段,尝试了下adb,然后就碰到了这个INSTALL_FAILED_NO_MATCHING_ABIS的坑... #解决方法 INSTALL_F ...

  4. 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)

    从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...

  5. 【抄袭】VB.NET扩展WebBrowser,拥有跳转前获取URL的能力

    来自 http://www.cnblogs.com/yuanjw/archive/2009/02/09/1386789.html 我仅做VB化,并优化了事件消息 Imports System.Comp ...

  6. .NET高级代码审计(第五课) .NET Remoting反序列化漏洞

    0x00 前言 最近几天国外安全研究员Soroush Dalili (@irsdl)公布了.NET Remoting应用程序可能存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerF ...

  7. Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法

    引言 EF是相对与Dapper.NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制.跟踪机制,所以在使用时有些地方需要特别注意. 下面我将自己 ...

  8. ConcurrentHashMap源码解析(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http:/ ...

  9. 【BZOJ3097】 Hash Killer I

    BZOJ3097 Hash Killer I Solution 考虑它是自然溢出,相当于就是对\(2^{63}\)取膜 那么就有\(aaaaa...aaa\)(多于64个)和\(baaaa...aaa ...

  10. Spring static 静态属性注入

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> &l ...