文档章节

初尝TCP/IP

Feeer
 Feeer
发布于 2017/05/03 09:24
字数 857
阅读 26
收藏 0

    TCP/IP是一套支持网络通信的协议系统(亦称TCP/IP协簇)其传输过程和格式的实际行为由厂商的TCP/IP软件(微软的winsocket)实现。

一、首先明白以下几点:

1、网络:计算机或类似计算机设备之间通信的常用传输介质的集合(通常传输介质为金属导线、甚至没有线路)。

2、网络协议:帮助定义复杂数据传输过程的通用规则。

3、TCP/IP标准:定义TCP/IP网络通信规则。

4、TCP/IP实现:是一个软件组,计算机通过它参与到TCP/IP网络中。

5、TCP/IP核心:逻辑编址(唯一MAC地址);路由选择(路由器、交换机);名称解析(DNS);错误控制和流量控制;应用支持。

6、TCP/IP基本联网系统:

7、TCP是面向连接的协议,提供复杂的流程控制和错误控制,确保发送数据的质量,更可靠,但是速度慢。

8、UDP是无连接协议,不可靠,但速度相对较快,多用于DNS。

二、TCP/IP应用流程

这里主要讲TCP连接,既然是面向连接协议,自然有服务端和客户端之别。

1、初始化网络:WSASTartup()

2、创建套接字:socket()

3、绑定端口:bind()

4、服务端监听:listen()

5、服务端等待连接:accept()

6、客户端请求连接:connect()

6、发送数据:send()

7、接收数据:recv()

8、关闭连接(删除套接字):closesocket()

9、清扫网络:WSAClean()

注意事项:*以上函数调用需要加入ws2_32.lib(ms)或者libws2_32(MingW)

                *除了前面有客户端和服务端字样的其余皆可用于客户端和服务端程序

以下是C++服务端函数代码,只需要在主函数调用即可

#include <iostream>
#include <winsock2.h>

SOCKET connection;
SOCKET socketserver;
char buf[]="this is TCPServer!";
static
void server()
{
    WSADATA wsaData;
    //调用网络函数之前都需要调用此函数
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        printf("failed to load winsock");
        return;
    }

    //creat socket
    socketserver=socket(AF_INET,SOCK_STREAM,0);

    //绑定端口
    SOCKADDR_IN addrserver;
    addrserver.sin_family=AF_INET;
    addrserver.sin_port=htons(10012);
    addrserver.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

    int re=bind(socketserver, (LPSOCKADDR)&addrserver, sizeof(SOCKADDR_IN));
    if(re==SOCKET_ERROR)
    {
        printf("faild bind:%d\n",WSAGetLastError());
        return;
    }

    //监听
    if(listen(socketserver,10)==SOCKET_ERROR)
    {
        printf("listen failed:%d\n",WSAGetLastError());
        return;
    }
    printf("listening......\n");

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    while(1)
    {
        //等待连接
        connection=accept(socketserver,(SOCKADDR*)&addrClient,&len);
        if(connection==SOCKET_ERROR)
        {
            printf("Accept failed:%d",WSAGetLastError());
            break;
        }
        printf("Accept client IP:[%s]\n",inet_ntoa(addrClient.sin_addr));

        //发送数据
        int iSend=send(connection,buf,sizeof(buf),0);
        if(iSend==SOCKET_ERROR)
        {
            printf("send failed!");
        }

        //接收数据
        char recvBuf[100];
        memset(recvBuf,0,sizeof(recvBuf));
        recv(connection,recvBuf,sizeof(recvBuf),0);
        printf("%s\n",recvBuf);
    }
    closesocket(socketserver);
    WSACleanup();
    system("pause");
}

 

下面是客户端代码:

#include <iostream>
#include <WinSock2.h>

using namespace std;

int main(int argc, char *argv[])
{
    static char addr[]="0.0.0.0";
    cout<< "please enter the IP you want to Link:\n";
    cin>>addr;
    const char *host=addr;


    char senddata[]="this is the fisrt message!";
    while(1)
    {
    cout << "TCPtest client:" << endl;

    //加载套接字
    WSADATA wsaData;
    char buf[1024];
    memset(buf,0,sizeof(buf));

    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        printf("failed to load Winsock!");
        break;
    }


    //创建套接字

    SOCKADDR_IN addrserv;
    addrserv.sin_family=AF_INET;
    addrserv.sin_port=htons(10012);
    addrserv.sin_addr.S_un.S_addr=inet_addr(host);

    SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
    if(socketClient==SOCKET_ERROR)
    {
        printf("socket() error%d",WSAGetLastError());
        break;
    }

    //请求链接
    if(connect(socketClient,(struct sockaddr*)&addrserv,sizeof(addrserv))==INVALID_SOCKET)
    {
        printf("connetion failed!");
        break;
    }
    else
    {
        //接收数据
        recv(socketClient,buf,sizeof(buf),0);
        printf("%s\n",buf);

         //发送数据

        const char *sendbuff=senddata;
         send(socketClient,sendbuff,sizeof(senddata),0);
         cout<< "enter something you want send(q to quit!):\n";
         cin>>senddata;
        closesocket(socketClient);
        WSACleanup();
    }
   }

    return 0;
}

 

首先运行服务端,再运行客户端,结果如下:

 

© 著作权归作者所有

Feeer
粉丝 0
博文 1
码字总数 857
作品 0
杭州
程序员
私信 提问
Wireshark中常见的TCP Info

1. TCP out-of-order segment TCP存在问题。 Wireshark判断TCP out-of-order是基于TCP包中SEQ number并非期望收到的下一个SEQ number,则判断为out-of-order。因此,出现TCP out-of-order时,...

sailikung
2018/08/29
0
0
第 1 章 了解 Web 及网络基础

1.web与http之间的关系 Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议 1)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web ...

Jonson
2016/04/10
92
0
【原创】劫波研究系列之十三:不可篡改,加密与风险(2)

TCP/IP协议的出现,为互联网日后的快速发展奠定了底层基础。 目前正处于互联网经济的高峰时期,以区块链为代表的技术将自此逐渐兴起。 — TCP/IP协议 拐点 网络应用 — 多个设备网络之间相互...

劫波李凯龙
02/26
0
0
MQTT基础概念介绍

源博客地址:http://blog.csdn.net/pipinet123 MQTT交流群:221405150 在MQTT群里有很多群友经常会把MQTT、MQTT Broker、MQTT Client这些概念搞混淆。 也有很多群友不知道MQTT相关产品去哪里找...

pipinet123
2017/03/08
0
0
骁龙/chuantou

#chuantou 内网穿透 v1.2版本 ##软件作用:可以让全世界访问家用电脑里的网站。 ##原理 ###client运行在家用电脑,内装有自己的网站。user为访问网站的浏览器。 ##内网穿透v1.2版特色 1、多协...

骁龙
2017/03/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写数据可视化大屏界面电子看板9-曲线效果

一、前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派、香橙派、全志H3、imx6)展示这么华...

飞扬青云
12分钟前
0
0
责任链模式

//这篇博客的博主真的不错,解析的都很清晰明了, https://blog.csdn.net/jason0539/article/details/45091639

南桥北木
38分钟前
3
0
Flutter -------- dio网络请求

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 1.添加依赖# dependencies: dio: 2.1.x #...

切切歆语
48分钟前
1
0
PHP的学习

PHP变量的命名必须以$符开始,如: $i;$j;$name; $符后面的第一个字符不可以是数字,只能是字母或者下划线(_)。 除了下划线(_)之外,变量中不能出现任何特殊字符,也就是变量只能包含...

墨冥
今天
3
0
一篇文章彻底搞懂Java虚拟机

概念: 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Jav...

骚年锦时
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部