tcp与udp实例(代码片段)

Heavysea Heavysea     2023-01-24     153

关键词:

有关TCP和UDP参照之前的博文

相关API和解释都可以参照之前的博文,这里只是采用send/recv函数实现TCP编程,同时实现了UDP编程

一、相关API

1.send函数

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

  • sockfd 指定发送端套接字描述符;
  • buf 指明一个存放应用程序要发送数据的缓冲区;
  • len 指明实际要发送的数据的字节数;
  • flags 一般置0。
  • 客户或者服务器应用程序都用send函数来向TCP连接的另一端发送数据

2.recv函数

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

  • sockfd 指定接收端套接字描述符;
  • buf 指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
  • len 指明buf的长度;
  • flags 一般置0。
  • 客户或者服务器应用程序都用recv函数从TCP连接的另一端接收数据。

3.recvfrom函数

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);

  • recvfrom通常用于无连接套接字,因为此函数可以获得发送者的地址。
  • src_addr 是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。
  • addrlen 常置为sizeof (struct sockaddr)。

4.sendto函数

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

  • sendto和send相似,区别在于sendto允许在无连接的套接字上指定一个目标地址。
  • dest_addr 表示目地机的IP地址和端口号信息,
  • addrlen 常常被赋值为sizeof (struct sockaddr)。
  • sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。

二、TCP实例

tcpServer

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define BACKLOG 10

/*
*scocket服务端
*
*1.socket
*2.bind
*3.listen
*4.accept
*5.send/recv
*/
int main(int argc,char **argv)
   
    int socketServer;
    int socketClient;
    int addrlen;
    int Ret;
    int recvLen;
    int clientNum = 0;
    char RcvBuf[1024];
    struct sockaddr_in socketServer_addr;
    struct sockaddr_in socketClient_addr;
    
    socketServer = socket(AF_INET , SOCK_STREAM , 0);
    if(-1==socketServer)
    
        printf("socket err\\n");
        return -1;
    

    socketServer_addr.sin_family = AF_INET;
    socketServer_addr.sin_port = htons(SERVER_PORT);  /* host to net, short */
    socketServer_addr.sin_addr.s_addr = INADDR_ANY;
    memset(socketServer_addr.sin_zero,0,8);
    
    Ret = bind(socketServer, (struct sockaddr*)&socketServer_addr, sizeof(struct sockaddr));
    if(-1==Ret)
    
        printf("bind err\\n");
        return -1;
        

    
    Ret = listen(socketServer, BACKLOG);
    if(-1==Ret)
    
        printf("listen err\\n");
        return -1;
     

    while(1)
    
        
        addrlen = sizeof(socketClient_addr);
        socketClient = accept(socketServer, (struct sockaddr*)&socketClient_addr,&addrlen);
        if(-1 != socketClient)
           
            clientNum++;
            printf("get %d connect %s from client\\n",clientNum,inet_ntoa(socketClient_addr.sin_addr));
            if(!fork())
            
                while(1)
                    
                    memset(RcvBuf,0,sizeof(RcvBuf));
                    recvLen = recv(socketClient, RcvBuf, 1000, 0);
                    if(recvLen<=0)
                    
                        close(socketClient);
                        return -1;
                    else
                        printf("get buf:from %d:%s\\n",clientNum,RcvBuf);
                    
                
            
        

    

    close(socketServer);
    
    return 0;


tcpClient

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define SERVER_PORT 8888
#define BACKLOG 10

/*
*scocket客户端
*
*1.socket
*2.connect
*3.send/recv
*/
int main(int argc,char **argv)
   
    int socketClient;
    int Ret;
    int sendLen;
    char SendBuf[1024];
    struct sockaddr_in socketServer_addr;

    if(argc!=2)
    
        printf("Usage:");
        printf("%s <serverIp>\\n",argv[0]);
        return -1;
    
    
    socketClient = socket(AF_INET , SOCK_STREAM , 0);
    if(-1==socketClient)
    
        printf("socket err\\n");
        return -1;
    

    socketServer_addr.sin_family = AF_INET;
    socketServer_addr.sin_port = htons(SERVER_PORT);  /* host to net, short */
    inet_aton(argv[1],&socketServer_addr.sin_addr);
    memset(socketServer_addr.sin_zero,0,8);

    Ret = connect(socketClient, (struct sockaddr*)&socketServer_addr,sizeof(struct sockaddr));
    if(-1 == Ret)
    
        printf("connect err\\n");
        return -1;
    
    
   while(1)
    
        memset(SendBuf,0,sizeof(SendBuf));
        if(fgets(SendBuf,1000,stdin))
        
            sendLen = send(socketClient, SendBuf, strlen(SendBuf), 0);
            if(sendLen<=0)
            
                close(socketClient);
                return -1;
            
        
        
    
  
    return 0;


三、UDP实例

udpServer

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define BACKLOG 10

/*UDP
*scocket服务端
*
*1.socket
*2.bind
*3.recvfrom
*/
int main(int argc,char **argv)
   
    int socketServer;
    int socketClient;
    int addrlen;
    int Ret;
    int recvLen;
    int clientNum = 0;
    char RcvBuf[1024];
    struct sockaddr_in socketServer_addr;
    struct sockaddr_in socketClient_addr;
    
    socketServer = socket(AF_INET , SOCK_STREAM , 0);
    if(-1==socketServer)
    
        printf("socket err\\n");
        return -1;
    

    socketServer_addr.sin_family = AF_INET;
    socketServer_addr.sin_port = htons(SERVER_PORT);  /* host to net, short */
    socketServer_addr.sin_addr.s_addr = INADDR_ANY;
    memset(socketServer_addr.sin_zero,0,8);
    
    Ret = bind(socketServer, (struct sockaddr*)&socketServer_addr, sizeof(struct sockaddr));
    if(-1==Ret)
    
        printf("bind err\\n");
        return -1;
        


    while(1)
    
        addrlen = sizeof(struct sockaddr);
        recvLen = recvfrom(socketServer, RcvBuf, 1000, 0,
                        (struct sockaddr*)&socketClient_addr, &addrlen);
        
        printf("Get Msg From %s : %s\\n", inet_ntoa(socketClient_addr.sin_addr), RcvBuf);
    

    close(socketServer);
    
    return 0;


udpClient

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define SERVER_PORT 8888
#define BACKLOG 10

/*UDP
*scocket客户端
*
*1.socket
*2.connect
*3.send/recv
*/
int main(int argc,char **argv)
   
    int socketClient;
    int Ret;
    int addrlen;
    int sendLen;
    char SendBuf[1024];
    struct sockaddr_in socketServer_addr;

    if(argc!=2)
    
        printf("Usage:");
        printf("%s <serverIp>\\n",argv[0]);
        return -1;
    
    
    socketClient = socket(AF_INET , SOCK_DGRAM , 0);
    if(-1==socketClient)
    
        printf("socket err\\n");
        return -1;
    

    socketServer_addr.sin_family = AF_INET;
    socketServer_addr.sin_port = htons(SERVER_PORT);  /* host to net, short */
    inet_aton(argv[1],&socketServer_addr.sin_addr);
    memset(socketServer_addr.sin_zero,0,8);

/*    Ret = connect(socketClient, (struct sockaddr*)&socketServer_addr,sizeof(struct sockaddr));
    if(-1 == Ret)
    
        printf("connect err\\n");
        return -1;
     */
    
   while(1)
    
        memset(SendBuf,0,sizeof(SendBuf));
        if(fgets(SendBuf,1000,stdin))
           
            addrlen = sizeof(struct sockaddr);
            sendLen = sendto(socketClient, SendBuf, strlen(SendBuf), 0,(struct sockaddr*)&socketServer_addr, addrlen);
            if(sendLen<=0)
            
                close(socketClient);
                return -1;
            
        
        
    
  
    return 0;


tcp与udp实例(代码片段)

有关TCP和UDP参照之前的博文相关API和解释都可以参照之前的博文,这里只是采用send/recv函数实现TCP编程,同时实现了UDP编程一、相关API1.send函数ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);sockfd指定发送端套接字描述符࿱... 查看详情

micropythonesp32udp和tcp数据收发通讯综合实例(代码片段)

【MicroPythonESP32】UDP和TCP数据收发通讯综合实例本示例基于Thonny平台开发。所需工具网络调试助手UDP和TCP4种通讯模式MicroPythonESP32设备作为TCP客户端MicroPythonESP32设备作为TCP服务端MicroPythonESP32设备作为UDP客户端MicroPythonESP32设备作为... 查看详情

tcp/udp(代码片段)

TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少;  3.UDP程序结构较简单  4.流模式(TCP)与数据报模式(UDP);  5.TCP保证数据正确性,UDP可能丢包  6.TCP保证数据顺序,UDP不保... 查看详情

tcp与udp,tcp服务器与客户端,udp服务器与客户端(代码片段)

目录TCP主要特点TCP的三次握手与四次挥手net模块 UDP主要特点UDP与TCP的区别dgram模块TCP的服务器与客户端创建TCP服务器创建TCP客户端 UDP的服务器与客户端创建UDP服务器创建UDP客户端TCP传输控制协议(TCP,TransmissionControlProt... 查看详情

4tcp与udp与websocket(代码片段)

...WebSocket1Socket概念1.1Socket简介1.2IPv4与IPv62TCP编程2.1服务端代码2.2Go的TCP客户端案例2.3Go的TCP响应解释3UDP4websocket概述5WebSocket原理6Go实现WebSocket1Socket概念1.1Socket简介大部分底层网络编程都依赖于Socket编程,包括:HTTP 查看详情

tcp与udp(代码片段)

IP提供了点到点的连续接,通过IP地址可以找到目标主机。但是目标主机有很多应用,服务器到底使用哪个应用来响应客户端?通过端口号决定。一、TCP:transmissioncontrolprotocol--传输控制协议可靠的,面向连接的协议,就像拨打电... 查看详情

tcp协议与udp协议(代码片段)

一.TCP协议:1.初识TCP:TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控... 查看详情

2018-10-10socket网络编程——udp与tcp(代码片段)

------------------------------------------------------------UDP------------------------------------------------------------因为udp发送数据之前不需要建立连接所有具有以下特点无连接资源开销小传输速度快udp每个数据包最大是64KUDP的优缺点  优点:  ... 查看详情

tcp与udp异同(代码片段)

TCP与UDP异同TCP/IP模型的运输层有两个不同的协议:UDP用户数据报协议与TCP传输控制协议相同点TCP与UDP都是运行在运输层的协议TCP与UDP的通信都需要开放端口不同点TCPTCP是面向连接的协议,提供全双工通信,需要建立链接之后再传... 查看详情

tcp与udp如何互通(代码片段)

今天再来个花式玩法。TCP连接的报文,结果却送到了UDPsocket,有趣…既然以太帧既可以在铜线上传输,也可以在光纤上,甚至空气里传输,那么SOCK_STREAMsocket也就可以在UDP上传输,反之,TCP报文也可以... 查看详情

tcp与udp比较以及并发编程基础知识(代码片段)

一、tcp比udp真正可靠地原因1.为什么tcp比udp传输可靠地原因:我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程涉及到计算机硬件,也就... 查看详情

第二十节——udp与tcp(代码片段)

网络编程学习一、InetAddressstaticInetAddressgetByName(Stringhost):确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址StringgetHostName():获取此IP地址的主机名StringgetHostAddress()返回文本显示中的IP地址字符串举例&... 查看详情

基于tcp与udp协议的socket通信(代码片段)

基于TCP与UDP协议的socket通信C/S架构与初识socket  在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是C/S架构,互联网中处处充满了C/S架构(Client/Server),比如我们需要玩英雄联盟,就必须连接至英雄联盟的服务器... 查看详情

tcp与dup简单对比(代码片段)

看回顾一下OSI7层协议网络模型再回顾一下OSI每一层的作用OSI7层协议模型与TCP/IP5层协议模型的对应关系从上述图片中可以看出tcp与udp是传输层的协议。TCP与DUP比较:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,... 查看详情

skill——iptables(代码片段)

扩展匹配条件一:udp扩展模块选项说明--sport匹配报文的源端口--dport匹配报文的目标端口和tcp模块中的名称一样,不同的是,udp模块中的--sport与--dport是用来匹配UDP协议报文的源端口与目标端口的udp模块与tcp模块类似,适用于tcp... 查看详情

终于把tcp与udp协议整明白了!(代码片段)

网络编程有三个要素,分别是IP地址、端口号和通信协议,那本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现。首先,我们需要了解一下IP地址、端口号、通信协议的相关知识。一、IP地址网络中的计算机使用IP地址来... 查看详情

c/c++socket-tcp与udp网络编程(代码片段)

前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>#pragmacomment(lib,"ws2_32.lib... 查看详情

基于tcp与udp协议的socket通信(代码片段)

 C/S架构与初识socket  在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Client/Server),比如我们需要玩英雄联盟,就必须连接至英雄联盟的服务器上,... 查看详情