linux网络编程——tcp和udp通信(代码片段)

mered1th mered1th     2022-12-06     146

关键词:

  • TCP协议流程图、TCP建立即时聊天
  • TCP即时聊天升级:服务器在客户端断开后不断开,客户端可以多次重连服务器进行即时聊天
  • UDP协议流程图、UDP建立即时连接
  • 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)需调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket,但也可以直接用setsockopt和reuse。
  • SO_RCVLOWAT设置接收缓冲区下限

1、TCP协议的流程图

服务端:socket---bind---listen---while(1)---accept---recv---send---close------close
客户端:socket----------------------------------connect---send---recv-----------------close

技术图片

TCP建立即时聊天

tcp_client.c

#include <func.h>

int main(int argc,char* argv[])

    ARGS_CHECK(argc,3);
    int socketFd;
    socketFd=socket(AF_INET,SOCK_STREAM,0);
    ERROR_CHECK(socketFd,-1,"socket");
    struct sockaddr_in ser;
    bzero(&ser,sizeof(ser));
    ser.sin_family=AF_INET;
    ser.sin_port=htons(atoi(argv[2]));
    ser.sin_addr.s_addr=inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    int ret;
    ret=connect(socketFd,(struct sockaddr*)&ser,sizeof(ser));
    ERROR_CHECK(ret, -1, "connect");
    printf("connect success\\n");
    char buf[128]=0;
    fd_set rdset;
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(socketFd, &rdset);
        ret = select(socketFd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(socketFd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recv(socketFd, buf, sizeof(buf), 0);
            ERROR_CHECK(ret, -1, "recv");
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            ret = send(socketFd, buf ,strlen(buf) - 1, 0);
            ERROR_CHECK(ret, -1, "send");
        
    
    close(socketFd);

tcp_server.c

#include <func.h>

int main(int argc,char* argv[])

    ARGS_CHECK(argc,3);
    int socketFd;
    socketFd = socket(AF_INET,SOCK_STREAM,0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    int ret;
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    listen(socketFd, 10);//缓冲区的大小,一瞬间能够放入的客户端连接信息
    int new_fd;
    struct sockaddr_in client;
    bzero(&client, sizeof(client));
    int addrlen = sizeof(client);
    new_fd = accept(socketFd, (struct sockaddr*)&client, &addrlen);
    ERROR_CHECK(new_fd, -1, "accept");
    printf("client ip=%s, port=%d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    fd_set rdset;
    char buf[128] = 0;
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(new_fd, &rdset);
        ret = select(new_fd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(new_fd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recv(new_fd, buf, sizeof(buf), 0);
            ERROR_CHECK(ret, -1, "recv");
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            ret = send(new_fd, buf, strlen(buf) - 1, 0);
            ERROR_CHECK(ret, -1, "send");
        
    
    close(new_fd);
    close(socketFd);
    return 0;

2、TCP即时聊天升级:服务器在客户端断开后不断开,客户端可以多次重连服务器进行即时聊天

tcp_server.c

#include <func.h>

int main(int argc,char* argv[])

    ARGS_CHECK(argc,3);
    int socketFd;
    socketFd = socket(AF_INET,SOCK_STREAM,0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    int ret;
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    listen(socketFd, 10);//缓冲区的大小,一瞬间能够放入的客户端连接信息
    int new_fd;
    struct sockaddr_in client;
    bzero(&client, sizeof(client));
    int addrlen = sizeof(client);
    char buf[128] = 0;
    fd_set rdset; 
    fd_set needMonitorSet; //需要监听的描述符集合
    FD_ZERO(&needMonitorSet);  
    FD_SET(STDIN_FILENO, &needMonitorSet);
    FD_SET(socketFd, &needMonitorSet);
    while(1)
        memcpy(&rdset, &needMonitorSet, sizeof(fd_set));
        ret = select(11, &rdset, NULL, NULL, NULL); //设最大监控描述符为10
        if(FD_ISSET(socketFd, &rdset)) //如果监听到客户端则accept接受远程计算机的连接请求
            new_fd = accept(socketFd, (struct sockaddr*)&client, &addrlen); //accept函数接受一个连接时,会返回一个新的socket标识符,以后数据的数据传输和读取就要通过这个新的socket编号来处理,原来的socket继续监听其他客户机的连接请求。
            ERROR_CHECK(new_fd, -1, "accept");
            printf("client ip=%s, port=%d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
            FD_SET(new_fd, &needMonitorSet);    
        
        if(FD_ISSET(new_fd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recv(new_fd, buf, sizeof(buf), 0);
            ERROR_CHECK(ret, -1, "recv");
            if(ret == 0)
                printf("byebye!\\n");
                FD_CLR(new_fd, &needMonitorSet);  //从needMonitorSet中删除new_fd
                close(new_fd);
                continue;
            
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            ret = send(new_fd, buf, strlen(buf) - 1, 0);
            ERROR_CHECK(ret, -1, "send");
        
    
    close(socketFd);
    return 0;

tcp_client.c和1同

3、使用UDP协议的流程图

服务端:socket---bind---recvfrom---sendto---close
客户端:socket----------sendto---recvfrom---close

技术图片

  • sendto()函数原型:
    int sendto(int sockfd, const void msg,int len,unsigned int flags,const struct sockaddr to, int tolen);

    该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。

  • recvfrom()函数原型:

    **int recvfrom(int sockfd,void buf,int len,unsigned int flags,struct sockaddr from,int *fromlen);**
    from是一个struct sockaddr类型的变量,该变量保存连接机的IP地址及端口号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno。

    UDP传输一个数据报示例:

    udp_server.c

#include <func.h>

int main(int argc, char **argv)
    ARGS_CHECK(argc, 3);
    int socketFd;
    socketFd = socket(AF_INET, SOCK_DGRAM, 0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser,sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    int ret;
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    char buf[128] = 0;
    struct sockaddr_in client;
    int addrlen = sizeof(client);
    ret = recvfrom(socketFd, buf, 5, 0, (struct sockaddr*)&client, &addrlen);
    ERROR_CHECK(ret, -1, "recvfrom");
    printf("client ip = %s, port = %d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    printf("udp server gets %s\\n", buf);
    //bzero(buf, sizeof(buf));
    //ret = recvfrom(socketFd, buf, 5, 0, (struct sockaddr*)&client, &addrlen);
    //ERROR_CHECK(ret, -1, "recvfrom");
    //printf("udp server gets %s\\n", buf);
    ret = sendto(socketFd, "world", 5, 0, (struct sockaddr*)&client, sizeof(client));
    ERROR_CHECK(ret, -1, "sendto");
    close(socketFd);
    return 0;

udp_client.c

#include <func.h>

int main(int argc, char *argv[])
    ARGS_CHECK(argc, 3);
    int socketFd;
    socketFd = socket(AF_INET, SOCK_DGRAM, 0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);
    int ret;
    ret = sendto(socketFd, "helloworld", 10, 0, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "sendto");
    char buf[128] = 0;
    ret = recvfrom(socketFd, buf, sizeof(buf), 0, NULL, NULL);
    ERROR_CHECK(ret, -1, "recvfrom");
    printf("udp client gets %s\\n", buf);
    close(socketFd);
    return 0;

4、使用UDP协议建立即时连接

udp_server.c

#include <func.h>

int main(int argc, char **argv)
    ARGS_CHECK(argc, 3);
    int socketFd;
    socketFd = socket(AF_INET, SOCK_DGRAM, 0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser,sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    int ret;
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    char buf[128] = 0;
    struct sockaddr_in client;
    int addrlen = sizeof(client);
    printf("client ip = %s, port = %d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    fd_set rdset;
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(socketFd, &rdset);
        ret = select(socketFd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(socketFd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recvfrom(socketFd, buf, sizeof(buf), 0, (struct sockaddr*)&client, &addrlen);
            ERROR_CHECK(ret, -1, "recvfrom");
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            bzero(buf, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(0 == ret)
                printf("byeybye\\n");
                break;
            
            ret = sendto(socketFd, buf, strlen(buf) - 1, 0, (struct sockaddr*)&client, sizeof(client));
            ERROR_CHECK(ret, -1, "sendto");
        
    
    close(socketFd);
    return 0;

udp_client.c

#include <func.h>

int main(int argc, char *argv[])
    ARGS_CHECK(argc, 3);
    int socketFd;
    socketFd = socket(AF_INET, SOCK_DGRAM, 0);
    ERROR_CHECK(socketFd, -1, "socket");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);
    int ret;
    char buf[128] = 0;
    fd_set rdset;
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(socketFd, &rdset);
        ret = select(socketFd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(socketFd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recvfrom(socketFd, buf, sizeof(buf), 0, NULL, NULL);
            ERROR_CHECK(ret, -1, "recvfrom");
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            bzero(buf, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(0 == ret)
                printf("byeybye\\n");
                break;
            
            ret = sendto(socketFd, buf, strlen(buf) - 1, 0, (struct sockaddr*)&ser, sizeof(ser));
            ERROR_CHECK(ret, -1, "sendto");
        
    
    close(socketFd);
    return 0;

5、如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)需调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket,但也可以直接用setsockopt和reuse。

int reuse=1;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&reuse,sizeof(int));

tcp_server.c

#include <func.h>

int main(int argc,char* argv[])

    ARGS_CHECK(argc,3);
    int socketFd;
    socketFd = socket(AF_INET,SOCK_STREAM,0);
    ERROR_CHECK(socketFd, -1, "socket");
    int ret;
    int reuse = 1;
    ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));
    ERROR_CHECK(ret, -1, "setsockopt");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    listen(socketFd, 10);//缓冲区的大小,一瞬间能够放入的客户端连接信息
    int new_fd;
    struct sockaddr_in client;
    bzero(&client, sizeof(client));
    int addrlen = sizeof(client);
    new_fd = accept(socketFd, (struct sockaddr*)&client, &addrlen);
    ERROR_CHECK(new_fd, -1, "accept");
    printf("client ip=%s, port=%d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    fd_set rdset;
    char buf[128] = 0;
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(new_fd, &rdset);
        ret = select(new_fd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(new_fd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recv(new_fd, buf, sizeof(buf), 0);
            ERROR_CHECK(ret, -1, "recv");
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            ret = send(new_fd, buf, strlen(buf) - 1, 0);
            ERROR_CHECK(ret, -1, "send");
        
    
    close(new_fd);
    close(socketFd);
    return 0;

tcp_client.c和1同

6、SO_RCVLOWAT:接收缓冲区下限

tcp_server_rcvlowat.c

#include <func.h>

int main(int argc,char* argv[])

    ARGS_CHECK(argc,3);
    int socketFd;
    socketFd = socket(AF_INET,SOCK_STREAM,0);
    ERROR_CHECK(socketFd, -1, "socket");
    int ret;
    int reuse = 1;
    ret = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));
    ERROR_CHECK(ret, -1, "setsockopt");
    struct sockaddr_in ser;
    bzero(&ser, sizeof(ser));
    ser.sin_family = AF_INET;
    ser.sin_port = htons(atoi(argv[2]));
    ser.sin_addr.s_addr = inet_addr(argv[1]);//点分十进制转为32位的网络字节序
    ret = bind(socketFd, (struct sockaddr*)&ser, sizeof(ser));
    ERROR_CHECK(ret, -1, "bind");
    listen(socketFd, 10);//缓冲区的大小,一瞬间能够放入的客户端连接信息
    int new_fd;
    struct sockaddr_in client;
    bzero(&client, sizeof(client));
    int addrlen = sizeof(client);
    new_fd = accept(socketFd, (struct sockaddr*)&client, &addrlen);
    ERROR_CHECK(new_fd, -1, "accept");
    printf("client ip=%s, port=%d\\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    fd_set rdset;
    char buf[128] = 0;
    int rcvLowAt = 10;
    ret=setsockopt(new_fd,SOL_SOCKET,SO_RCVLOWAT,&rcvLowAt,sizeof(int));

    ERROR_CHECK(ret, -1, "setsockopt");
    while(1)
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO, &rdset);
        FD_SET(new_fd, &rdset);
        ret = select(new_fd + 1, &rdset, NULL, NULL, NULL);
        if(FD_ISSET(new_fd, &rdset))
            bzero(buf, sizeof(buf));
            ret = recv(new_fd, buf, sizeof(buf), 0);
            ERROR_CHECK(ret, -1, "recv");
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            printf("%s\\n", buf);
        
        if(FD_ISSET(STDIN_FILENO, &rdset))
            memset(buf, 0, sizeof(buf));
            ret = read(STDIN_FILENO, buf, sizeof(buf));
            if(ret == 0)
                printf("byebye!\\n");
                break;
            
            ret = send(new_fd, buf, strlen(buf) - 1, 0);
            ERROR_CHECK(ret, -1, "send");
        
    
    close(new_fd);
    close(socketFd);
    return 0;

tcp_client.c和1同

[linux]linux网络之socket编程入门(代码片段)

...SocketAPI3.1公共接口3.2UDP接收发送数据3.3.TCP部分4.UDP及TCP的通信程序4.1UDP4.2TCP1.前言本文主要是介绍socket编程的一些接口函数,不会涉及协议的特性等等 查看详情

网络通信协议:tcp(三次握手四次挥手)和udp(代码片段)

通信要素2:网络协议 网络通信协议计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。问题:网络协议太复杂计算机网络通信涉及内容很多,比... 查看详情

关于网络通信中tcp/udp的端口范围-以及在linux系统中的使用权限说明(代码片段)

关于TCP/UDP的端口号的范围都是0~65535 根据IANA定义,可以参考如下链接:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtmlIANA将这些端口分成了3类,LastUpdated2023-03-30Portnumbersareassignedinvariousways,basedonthreerange... 查看详情

27.socket,tcp,udp,http基本通信原理(代码片段)

Socket,TCP,UDP,HTTP基本通信原理(摘自百度):TCP、UDP,HTTP底层通信都是通过socket套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(socket)。 socket就是在不同计算机之间进行通信的一个抽象。 ... 查看详情

第6课.网络编程(代码片段)

1.TCP和UDP的区别(1)TCP是面向连接的协议,UDP是面向无连接的协议。(2)TCP对系统资源要求较多,UDP对系统资源要求较少。(3)TCP是数据流模式,UDP是数据报模式。(4)TCP保证数据顺序及数据的正确性,UDP可能会丢包。2.简述T... 查看详情

「计算机网络」说说tcp和udp的区别及其应用场景(代码片段)

...面向连接字节流传输可靠传输仅支持单播传输提供全双工通信四、使用场景五、小结一、TCP/IP模型计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪... 查看详情

网络编程——tcp协议和通信(代码片段)

第1章 TCP通信TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区... 查看详情

unity网络通信(tcp&udp)(代码片段)

Unity/C#要想和其他电脑或者软件程序通讯,最好的方式是通过网络进行通讯,下面简要介绍以下其原理和实现:文章目录TCP和UDPTCPUnity简单实现TCP服务端TCP客户端UDPUnity简单实现UDP服务端UDP客户端TCP和UDPTCP和UDP是传输层... 查看详情

java网络编程之udp和tcp套接字(代码片段)

文章目录一.网络编程概述二.UDP网络编程1.UDP套接字2.UDP客户端回显服务器程序2.1UDP回显服务器2.2UDP客户端2.3UDP实现查词典的服务器三.TCP网络编程1.TCP套接字2.TCP客户端回显服务器程序2.1TCP回显服务器2.2TCP客户端2.3解决服务器无法... 查看详情

网络编程socket网络编程(代码片段)

微信公众号:菜鸟永恒第14天网络编程今日内容介绍?网络通信协议?UDP通信?TCP通信今日学习目标?能够辨别UDP和TCP协议特点?能够说出UDP协议下两个常用类名称?能够说出TCP协议下两个常用类名称?能够编写UDP协议下字符串数据传输程... 查看详情

python网络编程(通过tcp或者udp协议通信)(代码片段)

1、基于tcp协议传送文件:  客户端:importsocketimportosimportjsonimportstructclient=socket.socket()client.connect((‘127.0.0.1‘,8080))#文件大小file_size=os.path.getsize(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘)#文件名字file 查看详情

tcp和udp网络编程(代码片段)

...UDP对应的则是可靠性要求低、传输经济的应用1.基于TCP的网络编程IP是一个通信实体在网络上的地址,通信实体可以是打印机、计算机等。IP协议的作用是让Internet成为一个允许连接不同类型计算机和不同操作系统的网络。IP协... 查看详情

82.基于tcp和udp协议的简单通信套接字编程(代码片段)

目录一、基于tcp协议的简单通信套接字编程二、加上通信循环三、加上链接循环一、基于tcp协议的简单通信套接字编程#客户端、importsocket#1、买手机phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#流式协议=》tcp协议#2、拨通服务端电... 查看详情

javase——网络编程(udp/tcp)(代码片段)

网络编程入门 网络编程概述计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的... 查看详情

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

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

linux网络编程之套接字--tcp(代码片段)

...数🍨1.4、accept函数🍰1.5、connect函数🌺2、TCP网络编程🍡2.1、简单TCP通信程序--多进程版本🍢2.2、简单TCP通信程序--多线程版本🍧2.3、简单TCP通信程序--线程池版本🍀3、部署服务器🍡3.1、会话和进... 查看详情

计算机网络八股(代码片段)

...面向连接的,UDP是面向无连接的;TCP只能一对一通信,UDP支持一对一,一对多,多对一和多对多交互通信;TCP是面向字节流的,UDP是面向报文的;TCP是可靠传输,使用流量控制和拥塞控制;U... 查看详情

线程通信,网络编程,ip,端口,url,网络爬虫,udp,tcp(代码片段)

线程通信        多线程之间打成通信沟通的效果,协作完成业务需求    Object:        wait()线程等待 当调用某一个对象的wait方法,当前线程就会进入到与这个对象相关的等待池中进行等待--->等待阻塞,等待被唤醒   ... 查看详情