zoukankan      html  css  js  c++  java
  • TCP/UDP

    一、TCP通信流程

      

     1 #include "../common/InitSock.h"
     2 #include <stdio.h>
     3 CInitSock initSock;  // 初始化Winsock库
     4 int main()
     5 {
     6     // 创建套接字
     7     SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     8     if(sListen == INVALID_SOCKET)
     9     {  
    10         printf("Failed socket() 
    ");
    11         return 0;
    12     }
    13     // 填充sockaddr_in 结构
    14     sockaddr_in sin;
    15     sin.sin_family = AF_INET;
    16     sin.sin_port = htons(4567);
    17     sin.sin_addr.S_un.S_addr = INADDR_ANY;
    18     // 绑定这个套接字到一个本地地址
    19     if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    20     {
    21         printf("Failed bind() 
    ");
    22         return 0;
    23     }
    24     // 进入监听模式
    25     if(::listen(sListen, 2) == SOCKET_ERROR)
    26     {
    27         printf("Failed listen() 
    ");
    28         return 0;
    29     }
    30     // 循环接受客户的连接请求
    31     sockaddr_in remoteAddr;
    32     int nAddrLen = sizeof(remoteAddr);
    33     SOCKET sClient;
    34     char szText[] = " TCP Server Demo! 
    ";
    35     while(TRUE)
    36     {  // 接受新连接
    37         sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
    38         if(sClient == INVALID_SOCKET)
    39         {
    40             printf("Failed accept()");
    41             continue;
    42         }
    43         printf(" 接受到一个连接:%s 
    ", inet_ntoa(remoteAddr.sin_addr));
    44         // 向客户端发送数据
    45         ::send(sClient, szText, strlen(szText), 0);
    46         // 关闭同客户端的连接
    47         ::closesocket(sClient);
    48     }
    49     // 关闭监听套接字
    50     ::closesocket(sListen);
    51     return 0;
    52 }
    TCPServer
     1 #include "../common/InitSock.h"
     2 #include <stdio.h>
     3 CInitSock initSock;  // 初始化Winsock库
     4 int main()
     5 {
     6     // 创建套接字
     7     SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     8     if(s == INVALID_SOCKET)
     9     {  
    10         printf("Failed socket() 
    ");
    11         return 0;
    12     }
    13      
    14     // 也可以在这里调用bind 函数绑定一个本地地址
    15     // 否则系统将会自动安排
    16     ... 
    17     // 填写远程地址信息
    18     sockaddr_in servAddr;
    19     servAddr.sin_family = AF_INET;
    20     servAddr.sin_port = htons(4567);
    21     // 注意,这里要填写服务器程序(TCPServer 程序)所在机器的IP地址
    22     // 如果你的计算机没有联网,直接使用127.0.0.1即可
    23     servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    24     if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
    25     {  
    26         printf("Failed connect() 
    ");
    27         return 0;
    28     }
    29     // 接收数据
    30     char buff[256];
    31     int nRecv = ::recv(s, buff, 256, 0);
    32     if(nRecv > 0)
    33     {
    34         buff[nRecv] = '';
    35         printf(" 接收到数据:%s", buff);
    36     }
    37     // 关闭套接字
    38     ::closesocket(s);
    39     return 0;
    40 }
    TCPClient

    二、UDP 编程

    (1)服务器端程序设计流程如下。
        ①创建套接字(socket)。
        ②绑定 IP 地址和端口(bind)。
        ③收发数据(sendto/recvfrom)。
        ④关闭连接(closesocket)。
    (2)客户端程序设计流程如下。
        ①创建套接字(socket)。
        ②收发数据(sendto/recvfrom)。
        ③关闭连接(closesocket)。

     1 #include "../common/InitSock.h"
     2 #include <stdio.h>
     3 CInitSock initSock;  // 初始化Winsock库
     4 int main()
     5 {
     6     // 创建套接字
     7     SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     8     if(sListen == INVALID_SOCKET)
     9     {  
    10         printf("Failed socket() 
    ");
    11         return 0;
    12     }
    13     // 填充sockaddr_in 结构
    14     sockaddr_in sin;
    15     sin.sin_family = AF_INET;
    16     sin.sin_port = htons(4567);
    17     sin.sin_addr.S_un.S_addr = INADDR_ANY;
    18     // 绑定这个套接字到一个本地地址
    19     if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    20     {
    21         printf("Failed bind() 
    ");
    22         return 0;
    23     }
    24     // 进入监听模式
    25     if(::listen(sListen, 2) == SOCKET_ERROR)
    26     {
    27         printf("Failed listen() 
    ");
    28         return 0;
    29     }
    30     // 循环接受客户的连接请求
    31     sockaddr_in remoteAddr;
    32     int nAddrLen = sizeof(remoteAddr);
    33     SOCKET sClient;
    34     char szText[] = " TCP Server Demo! 
    ";
    35     while(TRUE)
    36     {  // 接受新连接
    37         sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
    38         if(sClient == INVALID_SOCKET)
    39         {
    40             printf("Failed accept()");
    41             continue;
    42         }
    43         printf(" 接受到一个连接:%s 
    ", inet_ntoa(remoteAddr.sin_addr));
    44         // 向客户端发送数据
    45         ::send(sClient, szText, strlen(szText), 0);
    46         // 关闭同客户端的连接
    47         ::closesocket(sClient);
    48     }
    49     // 关闭监听套接字
    50     ::closesocket(sListen);
    51     return 0;
    52 }
    53 // 创建套接字  // 完整代码在UDPServer工程下
    54 SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    55 if(s == INVALID_SOCKET)
    56 {
    57     printf("Failed socket() 
    ");
    58     return 0;
    59 }
    60 // 填充sockaddr_in 结构
    61 sockaddr_in sin;
    62 sin.sin_family = AF_INET;
    63 sin.sin_port = htons(4567);
    64 sin.sin_addr.S_un.S_addr = INADDR_ANY;
    65 // 绑定这个套接字到一个本地地址
    66 if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    67 {  
    68     printf("Failed bind() 
    ");
    69     return 0;
    70 }
    71 // 接收数据
    72 char buff[1024];
    73 sockaddr_in addr;
    74 int nLen = sizeof(addr);
    75 while(TRUE)
    76 {
    77     int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
    78     if(nRecv > 0)
    79     {
    80         buff[nRecv] = '';
    81         printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff);
    82     }
    83 }
    84 ::closesocket(s);
    85 
    86 // 填写远程地址信息 // 完整代码在UDPClient 工程下
    87 sockaddr_in addr;
    88 addr.sin_family = AF_INET;
    89 addr.sin_port = htons(4567);
    90 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
    91 // 发送数据
    92 char szText[] = " TCP Server Demo! 
    ";
    93 ::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
    UDP
    爱程序 不爱bug 爱生活 不爱黑眼圈 我和你们一样 我和你们不一样 我不是凡客 我要做geek
  • 相关阅读:
    c++------引用(左值与右值,引用一个数组,const限制)
    c++------智能指针,tuple多元数组
    c++中const和c中const区别
    c++新特性-------函数包装器,模板元加速
    c++新特性---lambda表达式
    c++新特性-收缩转换,二进制,constexpr,以及namespace&&inline
    Eureka 注册中心 和 Config中心 配置
    最近的日子-2019/8/12
    工作上的态度
    保持运动 对心情很重要
  • 原文地址:https://www.cnblogs.com/yifi/p/6482542.html
Copyright © 2011-2022 走看看