网络通信学习笔记之 ———Socket网络通信

这篇具有很好参考价值的文章主要介绍了网络通信学习笔记之 ———Socket网络通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、套接字

1、什么是套接字

​ 套接字(socket)是一种通信机制,是通信的两方的一种约定,socket屏蔽了各个协议的通信细节, 对用户进程提供了一套可以统一、方便的使用TCP/IP协议的接口。这使得程序员无需关注协议本身,直 接使用socket提供的接口与不同主机间的进程互联通信。
网络通信学习笔记之 ———Socket网络通信

2、创建套接字

​ 套接字描述符类似于文件描述符,UNIX、Linux把网络当文件看待,发送数据即写文件write,接收数 据即读文件read,销毁socket对象即关闭文件close,在UNIX、Linux系统下一切皆文件。

#include <sys/socket.h>
int socket (int domain, int type, int protocol);
功能:在内核中创建一个套接字对象
domain:通信地址类型
    AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信)
    AF_INET: 基于IPv4(32位IP地址)的网络通信
    AF_INET6: 基于IPv6(128位IP地址)的网络通信
type:通信协议类型
    SOCK_STREAM: 数据流协议,即TCP协议
    SOCK_DGRAM: 数据报协议,即UDP协议
protocol:特别通信协议,一般不用,置0即可
返回值:成功返回套接字描述符,失败返回-1

3、套接字的连接

​ 当socket对象创建好以后,它并不能立即被其它socket对象连接并通信,需要把一个地址与Socket对 象进行绑定,这样它才能被其它socket对象连接并通信。

// 基本地址类型,它是socket系列接口的表面参数,而实际使用的是sockaddr_un或sockaddr_in
struct sockaddr
{
	sa_family_t sa_family; // 地址类型,与创建socket对象时的domain参数一至即可
	char sa_data[14]; // 它是只是占位而已
};

// 本地地址类型
#include <sys/un.h>
struct sockaddr_un
{
    sa_family_t sun_family;
    char sun_path[]; // 套接字文件路径
};

// 网络地址类型
#include <netinet/in.h>
struct sockaddr_in
{
    sa_family_t sin_family;
    in_port_t sin_port; // 端口号,用于区分通信方的进程,1024~65535
    struct in_addr sin_addr; // IP地址
};

struct in_addr
{
	in_addr_t s_addr; // 32位IPv4地址
};
typedef uint32_t in_addr_t;

#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:将套接字和通信地址绑定在一起,由被动连接的Socket对象调用
addr:sockaddr_un、sockaddr_in结构变量的地址
addrlen:地址结构变量的字节数,便于bind区分用户提供的是sockaddr_un或sockaddr_in
返回值:成功返回0,失败返回-1
    
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:socket对象A连接socket对象B,由主动连接的Socket对象调用
sockfd:socket对象A的描述符,也就是连接的发起者
addr:socket对象B的通信地址,socket对象B必须与该通信地址绑定过
addrlen:地址结构变量的字节数
返回值:成功返回0,失败返回-1

二、IP地址转换与字节序转换

​ 主机字节序因处理器架构而不同,有的采用小端字节序,有的采用大端字节序,网络字节序则固定采 用大端字节序,所以在网络通信时需要把数据类型大于1字节的数据转换成网络字节序。

#include <arpa/inet.h>

// 32位无符号整数,主机字节序 -> 网络字节序
uint32_t htonl (uint32_t hostlong);

// 16位无符号整数,主机字节序 -> 网络字节序
uint16_t htons (uint16_t hostshort);

// 32位无符号整数,网络字节序 -> 主机字节序
uint32_t ntohl (uint32_t netlong);

// 16位无符号整数,网络字节序 -> 主机字节序
uint16_t ntohs (uint16_t netshort);

​ 日常生活中使用IPv4地址是点分十进制格式,而在程序中使用的是32位4字节无符号整数,并且还要 是采用大端字节序。

#include <arpa/inet.h>

// 点分十进制字符串 -> 网络字节序32位无符号整数
in_addr_t inet_addr (const char* cp);

// 点分十进制字符串 -> 网络字节序32位无符号整数
int inet_aton (const char* cp, struct in_addr* inp);

// 网络字节序32位无符号整数 -> 点分十进制字符串
char* inet_ntoa (struct in_addr in);

三、基于TCP协议的网络Socket通信

​ 由于TCP协议是基于面向连接的,而且在连接还需要进行三次握手,所以在通信前被连接Scoket对象 还需要开启监听和等待连接的步骤。

网络通信学习笔记之 ———Socket网络通信

1、开启监听

​ 在TCP服务器编程中listen函数使主动连接套接字变为被动连接套接口,使得一个进程可以接受其它进 程的连接请求,从而成为一个服务器进程。

#include <sys/socket.h>
int listen (int sockfd, int backlog);
sockfd: 一个已绑定未被连接的套接字描述符
backlog:连接请求队列(queue of pending connections)的最大长度(一般由24)
	用SOMAXCONN则为系统给出的最大值,TCP为侦听套接字维护的两个队列

网络通信学习笔记之 ———Socket网络通信

2、等待连接
int accept (int sockfd, struct sockaddr* addr,socklen_t* addrlen);
功能:从sockfd参数所标识套接字的未决连接请求队列中,提取第一个连接请求。
	同时创建一个新的套接字,用于在该连接中通信,返回该套接字的描述符。
addr:用于输出连接请求发起者的地址信息
addrlen:既是输入也是输出
    输入:它负责告诉accept函数addr的容量
    输出:它能从accept获取连接者的addr的字节数
返回值:成功返回通信套接字描述符,失败返回-1
3、TCP的数据发送和接收

​ Socket对象的本质就是内核文件对象,所以发送数据可以write函数,接收数据可以使用read函数,关 闭Socket对象close,但Socket在write、read的基础上封装了自己发送数据、接收数据的函数。

ssize_t recv (int sockfd, void* buf, size_t len,int flags);
功能:通过sockfd参数所标识的套接字,期望接收len个字节到buf所指向的缓冲区中。
返回值:成功返回实际接收到的字节数,失败返回-1。
flags:暂时写0即可,后续详细介绍
    
ssize_t send (int sockfd, const void* buf,size_t len, int flags);
功能:通过sockfd参数所标识的套接字,从buf所指向的缓冲区中发送len个字节。
返回值:成功返回实际被发送的字节数,失败返回-1
4、详细编程步骤

网络通信学习笔记之 ———Socket网络通信
网络通信学习笔记之 ———Socket网络通信

​ 服务端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void error_exit(const char *func)
{
    printf("%s:%m\n", func);
    exit(EXIT_FAILURE);
}
void *run(void *arg)
    {
    int cli_fd = *(int *)arg;
    char buf[4096];
    for (;;)
    {
        // 接收数据
        size_t ret = recv(cli_fd, buf, sizeof(buf), 0);
        if (0 >= ret || 0 == strcmp("quit", buf))
        break;
        printf("recv:%s bytes:%u\n", buf, ret);
        strcat(buf, ":return");
        // 返回数据
        ret = send(cli_fd, buf, strlen(buf) + 1, 0);
        if (0 >= ret)
        break;
	}
	printf("通信结束!\n");
	// 关闭通信socket
	close(cli_fd);
}

int main(int argc, const char *argv[])
{
    if (2 != argc)
    {
    printf("Use:./a.out <port>\n");
    return EXIT_FAILURE;
	}
    // 创建socket对象
    int svr_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (0 > svr_fd)
    	error_exit("socket");
    
    // 准备通信地址
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[1]));
    addr.sin_addr.s_addr = inet_addr("10.0.2.15");
    socklen_t addrlen = sizeof(addr);
    
    // 绑定socket对象和通信地址
    if (bind(svr_fd, (struct sockaddr *)&addr, addrlen))
        error_exit("bind");
    
    // 开启监听
    if (listen(svr_fd, 3))
    	error_exit("listen");
    
    for (;;)
    {
        // 等待连接
        int cli_fd = accept(svr_fd, NULL, NULL);
        if (0 > cli_fd)
        	error_exit("accept");
        
        pthread_t tid;
        pthread_create(&tid, NULL, run, &cli_fd);
        usleep(1000);
    }
    
    // 关闭连接socket
    close(svr_fd);
    return EXIT_SUCCESS;
}

​ 客户端代码:

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

void error_exit(const char* func)
{
    printf("%s:%m\n",func);
    exit(EXIT_FAILURE);
}

int main(int argc,const char* argv[])
{
    // 创建socket对象
    int cli_fd = socket(AF_INET,SOCK_STREAM,0);
    if(0 > cli_fd)
    	error_exit("socket");
    
    // 准备server的通信地址
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(2123);
    addr.sin_addr.s_addr = inet_addr("10.0.2.15");
    socklen_t addrlen = sizeof(addr);
    
    // 连接server
    if(connect(cli_fd,(struct sockaddr*)&addr,addrlen))
    	error_exit("connect");
    
    char buf[4096];
    for(;;)
    {
        printf(">>>");
        scanf("%s",buf);
        
        // 发送数据
        size_t ret = send(cli_fd,buf,strlen(buf)+1,0);
        if(0 >= ret || 0 == strcmp("quit",buf))
        	break;
        
        // 接收数据
        ret = recv(cli_fd,buf,sizeof(buf),0);
        if(0 >= ret)
        	break;
        
        printf("recv:%s bytes:%u\n",buf,ret);
    }
    
    printf("通信结束!\n");
    // 关闭socket对象
    close(cli_fd);
    return EXIT_SUCCESS;
}

四、基于UDP协议的网络Socket通信

1、UDP协议的特点
  • UDP是无连接的,即通信时不需要创建连接,发送数据结束时也没有连接可以释放,所以减小了开 销和发送数据前的延时;

  • UDP采用最大努力交付,不保证可靠交付,因此主机不需要维护复杂的连接状态;

  • UDP是面向报文的,只在应用层交下来的报文前增加了首部后就向下交付IP层,不需要解决粘包的 问题。

  • UDP是无阻塞控制的,即使网络中存在阻塞,也不会影响发送端的发送频率

  • UDP支持一对一、一对多、多对一、多对多的交互通信;

  • UDP的首部开销小,只有8个字节,它比TCP的20个字节的首部要短;

2、UDP的数据发送和接收
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
					const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP专用的数据发送函数。
dest_addr:收件人的地址。
addrlen:地址长度。
    
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
						struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP专用的数据接收函数。
src_addr:发件人的地址,也是数据返回时的地址
addrlen:地址长度。
3、详细编程步骤

网络通信学习笔记之 ———Socket网络通信

​ 服务端:

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

int main(int argc, const char *argv[])
{
    // 创建socket对象
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    // 准备通信地址(本机的)
    struct sockaddr_in addr = {}, src_addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(5566);
    addr.sin_addr.s_addr = inet_addr("192.168.56.103");
    socklen_t addrlen = sizeof(addr);
    
    // 绑定地址与socket对象
    if (bind(sockfd, (struct sockaddr *)&addr, addrlen))
    {
        perror("bind");
        return -1;
    }
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for (;;)
    {
        // 接收数据
        int size = recvfrom(sockfd, buf, buf_size, 0, (struct sockaddr
*)&src_addr, &addrlen);
        buf[size] = '\0';
        printf("from:%s recv:%s byte:%d\n", inet_ntoa(src_addr.sin_addr),
buf, size);
        strcat(buf, ":return");
        
        // 返回数据
        sendto(sockfd, buf, strlen(buf) + 1, 0, (struct sockaddr
*)&src_addr, addrlen);
    }
    
    return 0;
}

​ 客户端:

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

int main(int argc, const char *argv[])
{
    // 创建socket对象
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    // 准备通信地址(目标的)
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(5566);
    addr.sin_addr.s_addr = inet_addr("192.168.56.103");
    socklen_t addrlen = sizeof(addr);
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for (;;)
    {
        printf(">>>");
        scanf("%s", buf);
        if (0 == strcmp("quit", buf))
        {
            printf("通信结束!");
            close(sockfd);
            break;
        }
        
        sendto(sockfd, buf, strlen(buf)+1, 0, (struct sockaddr *)&addr,
addrlen);
        int size = recvfrom(sockfd, buf, buf_size, 0, (struct sockaddr
*)&addr, &addrlen);
        printf("from:%s recv:%s byte:%d\n", inet_ntoa(addr.sin_addr), buf,
size);
    }
}

4、UDP的连接操作

​ UPD协议底层是否需要连接操作,客户端但可以在Socket层面进行连接,连接后的Socket对象在后续 的通信过程中就不再需要通信地址了。

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

int main(int argc,const char* argv[])
{
    // 创建socket对象
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    // 准备通信地址(目标的)
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(7777);
    addr.sin_addr.s_addr = inet_addr("47.97.229.46");
    socklen_t addrlen = sizeof(addr);
    
    // 连接服务器
    if(connect(sockfd,(struct sockaddr*)&addr,addrlen))
    {
        perror("connect");
        return -1;
    }
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for(;;)
    {
        printf(">>>");
        scanf("%s",buf);
        
        send(sockfd,buf,strlen(buf)+1,0);
        if(0 == strcmp("quit",buf))
        {
            printf("通信结束!");
            close(sockfd);
            break;
        }
        
        int size = recv(sockfd,buf,buf_size,0);
        printf("from:%s recv:%s
byte:%d\n",inet_ntoa(addr.sin_addr),buf,size);
    }
}

五、本地Socket通信

1、本地Socket通信与网络Socket通信的区别

​ 网络Socket通信是把网卡抽象成Socket文件配合TCP/IP协议簇,能够使当前进程与其它计算机的进程 进行网络通信。

​ 本地Socket通信是在文件系统中创建Socket文件,能够使当前进程与本机的其它进程进行通信(IPC 进程间通信)。

2、创建Socket文件

使用sockaddr_un类型的通信地址,当调用socket对象与通信地址绑定时,会自动创建socket文件。文章来源地址https://www.toymoban.com/news/detail-481877.html

// 本地地址类型
#include <sys/un.h>
struct sockaddr_un
{
    sa_family_t sun_family;
    char sun_path[]; // 套接字文件路径
};

#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
3、基于TCP协议的本地Socket通信
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(int argc,const char* argv[])
{
    int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    struct sockaddr_un addr = {};
    addr.sun_family = AF_LOCAL;
    strcpy(addr.sun_path,"tcp_socket");
    socklen_t addrlen = sizeof(addr);
    
    if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
    {
        perror("bind");
        return -1;
    }
    
    if(listen(sockfd,3))
    {
        perror("listen");
        return -1;
    }
    
    for(;;)
    {
        int clifd = accept(sockfd,NULL,0);
        if(0 > clifd)
        {
            perror("accept");
            sleep(1);
            continue;
        }
        
        if(fork())
       		continue;
        
        char buf[4096];
        
        size_t buf_size = sizeof(buf);
        for(;;)
        {
            printf("recv...\n");
            int ret = recv(clifd,buf,buf_size,0);
            if(0 >= ret || 0 == strcmp("quit",buf))
            {
                printf("结束通信!");
                break;
            }
            
            buf[ret] = '\0';
            printf("recv:%s byte:%d\n",buf,ret);
            strcat(buf,":return");
            
            ret = send(clifd,buf,strlen(buf)+1,0);
            if(0 >= ret)
            {
                printf("结束通信!");
                break;
            }
        }
        
    	close(clifd);
    	return 0;
    }
    return 0;
}

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(int argc,const char* argv[])
{
    int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
    if(0 > sockfd)
    {
        perror("sockfd");
        return -1;
    }
    
    struct sockaddr_un addr = {};
    addr.sun_family = AF_LOCAL;
    strcpy(addr.sun_path,"tcp_socket");
    socklen_t addrlen = sizeof(addr);
    
    if(connect(sockfd,(struct sockaddr*)&addr,addrlen))
    {
        perror("connect");
        return -1;
    }
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for(;;)
    {
        printf(">>>");
        scanf("%s",buf);
        int ret = send(sockfd,buf,strlen(buf)+1,0);
        if(0 >= ret || 0 == strcmp("quit",buf))
        {
            printf("通信结束!\n");
                break;
        }
        
        ret = recv(sockfd,buf,buf_size,0);
        if(0 >= ret)
        {
            printf("通信结束!\n");
            break;
        }
        
        printf("recv:%s byte:%d\n",buf,ret);
    }
    
    close(sockfd);
    return 0;
}

4、基于UDP协议的网络Socket通信
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(int argc,const char* argv[])
{
    // 创建socket对象
    int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    // 准备通信地址(本机的)
    struct sockaddr_un addr = {}, src_addr = {};
    addr.sun_family = AF_LOCAL;
    strcpy(addr.sun_path,"udp_ctos");
    socklen_t addrlen = sizeof(addr);
    
    // 绑定地址与socket对象
    if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
    {
        perror("bind");
        return -1;
    }
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for(;;)
    {
        // 接收数据
        int size = recvfrom(sockfd,buf,buf_size,0,(struct
sockaddr*)&src_addr,&addrlen);
        
        printf("from:%s recv:%s byte:%d\n",src_addr.sun_path,buf,size);
        strcat(buf,":return");
        
        // 返回数据
        sendto(sockfd,buf,strlen(buf)+1,0,(struct
sockaddr*)&src_addr,addrlen);
    }
    
    return 0;
}

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(int argc,const char* argv[])
{
    // 创建socket对象
    int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }
    
    // 准备通信地址(自己的)
    struct sockaddr_un addr = {}, dest_addr = {};
    addr.sun_family = AF_LOCAL;
    strcpy(addr.sun_path,"udp_stoc");
    socklen_t addrlen = sizeof(addr);
    
    // 绑定地址与socket对象
    if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
    {
        perror("bind");
        return -1;
    }
    
    // 目标的
    dest_addr.sun_family = AF_LOCAL;
    strcpy(dest_addr.sun_path,"udp_ctos");
    
    char buf[4096];
    size_t buf_size = sizeof(buf);
    
    for(;;)
    {
        printf(">>>");
        scanf("%s",buf);
        if(0 == strcmp("quit",buf))
        {
            printf("通信结束!");
            close(sockfd);
            break;
        }
        
        sendto(sockfd,buf,strlen(buf)+1,0,(struct
sockaddr*)&dest_addr,addrlen);
        int size = recvfrom(sockfd,buf,buf_size,0,(struct
sockaddr*)&dest_addr,&addrlen);
        printf("recv:%s byte:%d\n",buf,size);
    }
}

到了这里,关于网络通信学习笔记之 ———Socket网络通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux_网络通信-套接字通信socket-网络字节序-IP地址转换函数-inet_pton函数-htonl函数-htons函数-ntohl函数-ntohs函数

    接上一篇:linux_进程锁与文件锁-pthread_mutexattr_init函数-pthread_mutexattr_setpshared函数   今天开始分享网络通信了,主要是就是socket套接字通信,本篇先分享一些预备知识,有网络字节序以及一些IP地址转换函数,话不多说,开始上菜: 此博主在CSDN发布的文章目录:我的CSDN目录

    2024年02月03日
    浏览(58)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(79)
  • 学习网络编程No.5【TCP套接字通信】

    北京时间:2023/8/25/15:52,昨天刚把耗时3天左右的文章更新,充分说明我们这几天并不是在摆烂中度过,而是在为了更文不懈奋斗,历时这么多天主要是因为该部分知识比较陌生,所以需要我们花费大量的时间去细细研究,为后面无论是TCP套接字,还是网络的学习都能更加融会

    2024年02月10日
    浏览(61)
  • Linux之套接字UDP实现网络通信

    ​ 套接字(Socket)是计算机网络中实现网络通信的一种 编程接口 。它提供了应用程序与网络通信之间的一座桥梁,因为它允许应用程序通过网络发送和接收相应的数据以实现不同主机之间的通信。 ​ 通常套接字由以下两部分组成: 1.网络IP和端口号 :IP用来标识主机,而端口

    2024年02月11日
    浏览(45)
  • Linux下套接字TCP实现网络通信

    ​ 套接字(Socket) 是计算机网络中实现网络通信的一种 编程接口 。它提供了应用程序与网络通信之间的一座桥梁,因为它允许应用程序通过网络发送和接收相应的数据以实现不同主机之间的通信。 通常套接字由以下两部分组成: 1.网络IP和端口号 :IP用来标识主机,而端口号

    2024年02月10日
    浏览(46)
  • 【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

    源IP地址(Source IP Address): 源IP地址是数据包发送方(或数据流出发点)的唯一标识符。它用于在互联网或本地网络中定位发送数据包的设备或主机。源IP地址是数据包的出发点,即数据从这个地址开始传送,向目的IP地址指示的设备发送。 在TCP/IP协议中,源IP地址通常由发

    2024年02月14日
    浏览(86)
  • C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

    流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1)加载套接字库( 使用函数WSAStartup() ),创建套接字( 使用socket() ) 2)绑定套接字到一个IP地址和一个端口上( 使用函数bind() ) 3)将套接字设置为监听模式等待连接请求( 使用函数

    2024年02月03日
    浏览(60)
  • 网络通信学习笔记之 ———Socket网络通信

    一、套接字 1、什么是套接字 ​ 套接字(socket)是一种通信机制,是通信的两方的一种约定,socket屏蔽了各个协议的通信细节, 对用户进程提供了一套可以统一、方便的使用TCP/IP协议的接口。这使得程序员无需关注协议本身,直 接使用socket提供的接口与不同主机间的进程互

    2024年02月08日
    浏览(46)
  • 【IPC通信--socket套接字--心跳包】

    随着网络通信技术的不断发展,网络通信已成为我们日常工作和生活中不可或缺的一部分。但是在使用网络通信的过程中,时常会遇到网络延迟、丢包等问题,这些问题不仅影响我们的工作和生活效率,也会给我们的网络带来一定的风险和安全隐患。为了解决这些问题,Soc

    2024年01月22日
    浏览(38)
  • 14.10 Socket 套接字选择通信

    对于网络通信中的服务端来说,显然不可能是一对一的,我们所希望的是服务端启用一份则可以选择性的与特定一个客户端通信,而当不需要与客户端通信时,则只需要将该套接字挂到链表中存储并等待后续操作,套接字服务端通过多线程实现存储套接字和选择通信,可以提

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包