zoukankan      html  css  js  c++  java
  • TCPServer TCPClient三次握手模拟编程

    套接字创建和关闭:

    SOCKET socket(int af,int type,int protocal);
    
    套接字类型:
    
    SOCK_STREAM 流套接字,TCP提供有连接的可靠传输
    
    SOCK_DGRAM 数据包套接字,UDP提供无连接的不可靠传输
    
    SOCK_RAW 原始套接字

    绑定套接字到指定的IP地址和端口号

    int bind(
    SOCKET s,//套接字句柄
    const struct sockaddr * name,//关联的本地地址
    int namelen//地址的长度
    );

    监听

    int listen(
    SOCKET s,//套接字
    int backlog//最大连接数
    )

    连接

    int accept(
    SOCKET s,
    struct sockaddr* addr,//取得对方的地址信息
    int* addrlen//指向地址长度
    );
    
    int connect(
      SOCKET s,
      const struct sockaddr FAR* name,//连接的地址信息
      int namelen  //结构长度
    );

    收发数据

    int send(
    SOCKET s,
    const char FAR* buf,//要发送数据的缓冲区地址
    int len,//缓冲区长度
    int flags//指定调用方式,通常为0
    );
    int recv(
    SOCKET s,
    char FAR* buf,
    int len,
    int
    );

    TCPSERVER端代码:

     1 // TCP.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <winsock2.h>
     6 #include <stdio.h>
     7 
     8 #pragma comment(lib,"WS2_32")
     9 class CInitSock
    10 {
    11 public:
    12     CInitSock(BYTE minorVer=2,BYTE majorVer=2)
    13     {
    14         WSADATA wsaData;
    15         WORD sockVersion = MAKEWORD(minorVer,majorVer);
    16         if(::WSAStartup(sockVersion,&wsaData)!=0)
    17         {
    18             exit(0);
    19         }
    20     }
    21     ~CInitSock()
    22     {
    23         ::WSACleanup();
    24     }
    25 };
    26 CInitSock initSock;
    27 int _tmain(int argc, _TCHAR* argv[])
    28 {
    29     SOCKET sListen = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    30     if(sListen == INVALID_SOCKET)
    31     {
    32         printf("Failed socket()\n");
    33         return 0;
    34     }
    35     //填充sockaddr_in结构
    36     sockaddr_in sin;
    37     sin.sin_family = AF_INET;
    38     sin.sin_port = htons(4567);
    39     sin.sin_addr.S_un.S_addr = INADDR_ANY;
    40     //绑定这个套接字的一个本地地址
    41     if(::bind(sListen,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
    42     {
    43         printf("Failed bind()\n");
    44         return 0;
    45     }
    46     //进入监听模式
    47     if(::listen(sListen,2) == SOCKET_ERROR)
    48     {
    49         printf("Failed listen()\n");
    50         return 0;
    51     }
    52     //循环接受客户的连接请求
    53     sockaddr_in remoteAddr;
    54     int nAddrLen = sizeof(remoteAddr);
    55     SOCKET sClient;
    56     char szText[] = "TCP Server Demo!\r\n";
    57     while(TRUE)
    58     {
    59         //接受新连接
    60         sClient=::accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);
    61         if(sClient == INVALID_SOCKET)
    62         {
    63             printf("Failed accept()");
    64             continue;
    65         }
    66         printf("接受到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr));
    67         //向客户端发送数据
    68         ::send(sClient,szText,strlen(szText),0);
    69         //关闭同客户端的连接
    70         ::closesocket(sClient);
    71     }
    72     ::closesocket(sListen);
    73     return 0;
    74 }

    TCPClient 端代码:

     1 // TCPClient.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <winsock2.h>
     6 #include <stdio.h>
     7 #pragma comment(lib,"WS2_32")
     8 class CInitSock
     9 {
    10 public:
    11     CInitSock(BYTE minorVer=2,BYTE majorVer=2)
    12     {
    13         WSADATA wsaData;
    14         WORD sockVersion = MAKEWORD(minorVer,majorVer);
    15         if(::WSAStartup(sockVersion,&wsaData)!=0)
    16         {
    17             exit(0);
    18         }
    19     }
    20     ~CInitSock()
    21     {
    22         ::WSACleanup();
    23     }
    24 };
    25 CInitSock initSock;
    26 
    27 int _tmain(int argc, _TCHAR* argv[])
    28 {
    29     SOCKET s= ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    30     if(s==INVALID_SOCKET)
    31     {
    32         printf("Failed socket()\n");
    33         return 0;
    34     }
    35     sockaddr_in servAddr;
    36     servAddr.sin_family=AF_INET;
    37     servAddr.sin_port=htons(4567);
    38     servAddr.sin_addr.S_un.S_addr=inet_addr("49.140.16.244");
    39     if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==-1)
    40     {
    41         printf("Failed connect()\n");
    42         return 0;
    43     }
    44     //接受数据
    45     char buff[256];
    46     int nRecv=::recv(s,buff,256,0);
    47     if(nRecv>0)
    48     {
    49         buff[nRecv] = '\0';
    50         printf("接受到数据:%s",buff);
    51     }
    52     ::closesocket(s);
    53     return 0;
    54 }

    结果:

  • 相关阅读:
    IO流总览图
    自己实现的一个数组排序并去重的功能
    Java常量池详解之一道比较蛋疼的面试题
    一个简单的数组去重并排序方法
    Delphi开发经验谈
    再谈Delphi vs VC++(非常精彩)
    C#根据当前时间获取,本周,本月,本季度等时间段
    delphi CopyMemory、FillMemory、MoveMemory、ZeroMemory
    DupeString 与 StringOfChar 的区别
    SQL最大值加1
  • 原文地址:https://www.cnblogs.com/xing901022/p/2715900.html
Copyright © 2011-2022 走看看