• 在TCP协议下的数据传送


    本人小白菜逼一枚,,,,刚建立博客,也写不了太深入的,就写点上课的笔记什么的。有错误希望广大博友指出,我一定虚心学习接收改正。

    我的新浪邮箱:liudaohui0805@sina.com

    我的QQ邮箱:1019089094@qq.com

    计算机网络部分今天主讲的tcp和udp协议,这两协议都是数据链路层下的重要协议,说其重要原因是因为在数据间传送时

    TCP安全可靠,不丢包,面向连接,三次握手,四次挥手,效率低;

    UDP数据传输速度快,面向无连接类型;

    其次讲了端口号:端口号分三类,第一类,知名端口:是被注册的端口柏阔http80端口,范围是0~1023;

    什么是http80端口:80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。

                第二类,动态端口:供本机使用的端口越好,即系统随机分配,范围是1024~5000

                    第三类,保留端口:为服务器保留的专有端口号。 范围是 5000~65535

    还有Listen:

    载波监听多点接入/碰撞检测 
    CSMA/CD 表示 Carrier Sense Multiple Access with Collision Detection。
    “多点接入”表示许多计算机以多点接入的方式连接在一根总线上。
    “载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
    总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。
    碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”
    每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。

    改变Socket属性:

    属性分为  阻   塞:默认状态下是阻塞状态

          非阻塞:u_long mode = 1;ioetlsocket(socket的名字,FIONBIO,地址&mode);

     函数原型     int ioctlsocket(
                _In_     SOCKET s,
                _In_     long cmd,
                _Inout_  u_long *argp
              );

    cout<<"------------------------------------------------------------------------------------------"<<endl; 

    重点来了:针对本阶段的学习方向,在家中和在教室使用的ip不同,每次应该记得更换ip地址

        使用TCP通信和UDP通信 的实现过程不同,作为初学者应该仔细斟酌,

          之后会对两种通信方式的差异进行详细的分析和区别,进行理解。

    cout<<"------------------------------------------------------------------------------------------"<<endl; 

    服务端就是接收端

    服务端的代码

    #include <iostream>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <windows.h>
    #include <fstream>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    class FileInfo
    {
    public:
    void SetFileName(char *szname)
    {
    strcpy_s(m_szfilename,MAX_PATH,szname);
    }
    char *GetFileName()
    {
    return m_szfilename;
    }
    void SetFileSize(DWORD dwfilesize)
    {
    m_dwfilesize = dwfilesize;
    }
    DWORD GetFileSize()
    {
    return m_dwfilesize;
    }
    private:
    char m_szfilename[MAX_PATH];
    DWORD m_dwfilesize;

    };

    int main()
    {

    //1,加载库;
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    SOCKET socketserver ;
    SOCKET socketwaiter ;
    try
    {
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
    throw err;
    }
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
    throw 2;
    }
    else
    printf("The Winsock 2.2 dll was found okay ");

    //2,创建套接字
    socketserver = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP );
    if (socketserver == INVALID_SOCKET )
    {
    throw "Create Failed";
    }
    //3,绑定
    sockaddr_in sockaddrserver;
    sockaddrserver.sin_family = AF_INET;//地址族
    sockaddrserver.sin_addr.s_addr= inet_addr("192.168.1.114");
    sockaddrserver.sin_port = htons(1234);

    if (SOCKET_ERROR
    == bind(socketserver,(const sockaddr*)&sockaddrserver,sizeof(sockaddr_in) ))
    {
    int n = GetLastError();
    throw "Bind Faild";
    }
    //4,监听
    if (SOCKET_ERROR == listen(socketserver,10))//队列的最大长度10
    {
    throw "Listen Faild";
    }
    //5,接收
    sockaddr_in addrclient;
    int nsize = sizeof(addrclient);
    cout<<"sssssssssssss"<<endl;

    socketwaiter = accept(socketserver,(sockaddr*)&addrclient,&nsize);
    if (INVALID_SOCKET == socketwaiter)
    {
    int n = GetLastError();
    throw "Accept Failed";
    }
    //接收文件头
    FileInfo fi;
    //接收文件头
    recv(socketwaiter,(char *)&fi,sizeof FileInfo,0);
    char szpath[MAX_PATH] = "E:\";
    strcat_s(szpath,MAX_PATH,fi.GetFileName());
    //创建文件
    fstream fs;
    fs.open(szpath,fstream::out|fstream::binary|fstream::trunc);
    if (!fs)
    {
    throw "sdasdasdada";
    }
    char szbuf[4*1024] = {0};
    //接收文件内容
    int filesize = fi.GetFileSize();
    while (filesize)
    {
    int nrelRecvNum = recv(socketwaiter,szbuf,sizeof(szbuf),0);
    if (nrelRecvNum > 0)
    {
    filesize -= nrelRecvNum;
    fs.write(szbuf,nrelRecvNum);
    }
    }
    fs.close();
    }
    catch(int nerror)
    {
    switch (nerror)
    {
    case 1:
    break;
    }
    return 0;
    }
    catch( char *szname)
    {
    cout<<endl;
    cout<<"傻逼了吧"<<endl;
    WSACleanup();
    if (socketserver)
    {
    closesocket(socketserver);
    socketserver = NULL;
    }
    return 0;

    }
    closesocket(socketserver);
    closesocket(socketwaiter);
    WSACleanup();
    system("pause");
    return 0;
    }

    客户端就是发送端:

    客户端代码:

    #include <iostream>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <windows.h>
    #include <fstream>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")


    class FileInfo
    {
    public:
    void SetFileName(char *szname)
    {
    strcpy_s(m_szfilename,MAX_PATH,szname);
    }
    char *GetFileName()
    {
    return m_szfilename;
    }
    void SetFileSize(DWORD dwfilesize)
    {
    m_dwfilesize = dwfilesize;
    }
    DWORD GetFileSize()
    {
    return m_dwfilesize;
    }
    private:
    char m_szfilename[MAX_PATH];
    DWORD m_dwfilesize;

    };
    int main()
    {
    //1,加载库;
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    SOCKET socketclient;

    try
    {
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
    throw err;
    }
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
    throw 2;
    }
    else
    printf("The Winsock 2.2 dll was found okay ");

    //2,创建套接字
    socketclient = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
    if (socketclient == INVALID_SOCKET )
    {
    throw "Create Failed";
    }
    //3.
    sockaddr_in addrock;
    addrock.sin_family = AF_INET;
    addrock.sin_addr.s_addr= inet_addr("192.168.1.114");
    addrock.sin_port = htons(1234);
    //创建socket
    if (SOCKET_ERROR == connect(socketclient,(sockaddr *)&addrock,sizeof(addrock)))
    {
    throw "sdada";
    }
    //获得文件头信息
    char szfilename[MAX_PATH] = "C:\Users\Public\Pictures\Sample Pictures\benbenla-07c.jpg";
    fstream fs;
    fs.open(szfilename,fstream::binary|fstream::in);
    if (!fs)
    {
    throw "ssss";
    }
    fs.seekg(0,fstream::end);
    int nfilesize = fs.tellg();
    fs.seekg(0,fstream::beg);
    //文件信息
    FileInfo fi;
    fi.SetFileName("benbenla-07c.jpg");
    fi.SetFileSize(nfilesize);

    //发送文件头
    send(socketclient,(char *)&fi,sizeof FileInfo,0);
    //获得文件的内容
    char szbuf[4*1024] = {0};
    //发送文件内容
    while (1)
    {
    fs.read(szbuf,4096);//一次读4096
    int nRelReadNum = fs.gcount();//获得当前字节数

    if (nRelReadNum == 0)
    {
    break;
    }
    int n = send(socketclient,szbuf,nRelReadNum,0);
    }
    fs.close();
    }
    catch(int nerror)
    {
    switch (nerror)
    {
    case 1:
    break;
    }
    return 0;
    }
    catch( char *szname)
    {
    WSACleanup();
    if (socketclient)
    {
    closesocket(socketclient);
    socketclient = NULL;
    }
    return 0;

    }

    closesocket(socketclient);
    //6,卸载库
    WSACleanup( );
    system("pause");
    return 0;
    }

  • 相关阅读:
    看见一个希腊字母表
    剑桥的技术报告列表
    CompaqDEC的技术报告
    linux动态链接库的使用
    Vectored I/O or ScatterGather I/O
    week reference
    Cache pingpong
    [zz] References on Mutual Excuslion
    redis: event loop
    看WinForm源代码的笔记
  • 原文地址:https://www.cnblogs.com/LiuDaohui0805/p/5119973.html
Copyright © 2020-2023  润新知