购物网站开发问题域分析,做网站哪里学,现在怎么做跨境电商平台,王烨全国有多少人关于套接字通信定义如下#xff1a; 套接字对应程序猿来说就是一套网络通信的接口#xff0c;使用这套接口就可以完成网络通信。网络通信的主体主要分为两部分#xff1a;客户端和服务器端。在客户端和服务器通信的时候需要频繁提到三个概念#xff1a;IP、端口、通信数据 套接字对应程序猿来说就是一套网络通信的接口使用这套接口就可以完成网络通信。网络通信的主体主要分为两部分客户端和服务器端。在客户端和服务器通信的时候需要频繁提到三个概念IP、端口、通信数据下面介绍一下需要注意的一些细节问题。
引用来源于爱编程的大丙 服务器端的套接字通信流程 1建立套接字,这个套接字就是一个文件描述符。 int lfd socket();函数原型如下// 创建一个套接字 int socket(int domain, int type, int protocol) 参数: domain: 使用的地址族协议
AF_INET: 使用IPv4格式的ip地址AF_INET6: 使用IPv4格式的ip地址 type:SOCK_STREAM: 使用流式的传输协议SOCK_DGRAM: 使用报式(报文)的传输协议protocol: 一般写0即可, 使用默认的协议SOCK_STREAM: 流式传输默认使用的是tcpSOCK_DGRAM: 报式传输默认使用的udp 返回值:成功: 可用于套接字通信的文件描述符失败: -1 函数的返回值是一个文件描述符通过这个文件描述符可以操作内核中的某一块内存网络通信是基于这个文件描述符来完成的。 // 1. 创建监听的套接字int lfd socket(AF_INET, SOCK_STREAM, 0);if(lfd -1){perror(socket);exit(0);}2绑定将得到的监听的文件描述符和本地的IP 端口进行绑定 // 将文件描述符和本地的IP与端口进行绑定 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 返回值成功返回0失败返回-1 // 2. 将socket()返回值和本地的IP端口绑定到一起struct sockaddr_in addr;addr.sin_family AF_INET;//系统存储的是小端端口所以需要转换一下addr.sin_port htons(10000); // 大端端口这里因为网络通信是使用的大端端口// INADDR_ANY代表本机的所有IP, 假设有三个网卡就有三个IP地址// 这个宏可以代表任意一个IP地址// 这个宏一般用于本地的绑定操作addr.sin_addr.s_addr INADDR_ANY; // 这个宏的值为0 0.0.0.0因为这个都是0000不需要大小端转换int ret bind(lfd, (struct sockaddr*)addr, sizeof(addr));if(ret -1){perror(bind);exit(0);}
(3) 设置监听 // 给监听的套接字设置监听 int listen(int sockfd, int backlog); 参数
sockfd: 文件描述符, 可以通过调用socket()得到在监听之前必须要绑定 bind()backlog: 同时能处理的最大连接要求最大值为128 返回值函数调用成功返回0调用失败返回 -1 // 3. 设置监听ret listen(lfd, 128);if(ret -1){perror(listen);exit(0);}
4阻塞并等待连接 会得到一个新的文件描述符(通信的) // 等待并接受客户端的连接请求, 建立新的连接, int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 返回值函数调用成功得到一个文件描述符, 用于和建立连接的这个客户端通信调用失败返回 -1 // 4. 阻塞等待并接受客户端连接struct sockaddr_in cliaddr;int clilen sizeof(cliaddr);int cfd accept(lfd, (struct sockaddr*)cliaddr, clilen);if(cfd -1){perror(accept);exit(0);}5如果成功之后打印一条消息可有可无 // 打印客户端的地址信息char ip[24] {0};printf(客户端的IP地址: %s, 端口: %d\n,inet_ntop(AF_INET, cliaddr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(cliaddr.sin_port));6开始通信 // 5. 和客户端通信while(1){// 接收数据char buf[1024];memset(buf, 0, sizeof(buf));int len read(cfd, buf, sizeof(buf));if(len 0){printf(客户端say: %s\n, buf);write(cfd, buf, len);}else if(len 0){printf(客户端断开了连接...\n);break;}else{perror(read);break;}}server.c
// server.c
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include arpa/inet.hint main()
{// 1. 创建监听的套接字int lfd socket(AF_INET, SOCK_STREAM, 0);if(lfd -1){perror(socket);exit(0);}// 2. 将socket()返回值和本地的IP端口绑定到一起struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(10000); // 大端端口// INADDR_ANY代表本机的所有IP, 假设有三个网卡就有三个IP地址// 这个宏可以代表任意一个IP地址// 这个宏一般用于本地的绑定操作addr.sin_addr.s_addr INADDR_ANY; // 这个宏的值为0 0.0.0.0int ret bind(lfd, (struct sockaddr*)addr, sizeof(addr));if(ret -1){perror(bind);exit(0);}// 3. 设置监听ret listen(lfd, 128);if(ret -1){perror(listen);exit(0);}// 4. 阻塞等待并接受客户端连接struct sockaddr_in cliaddr;int clilen sizeof(cliaddr);int cfd accept(lfd, (struct sockaddr*)cliaddr, clilen);if(cfd -1){perror(accept);exit(0);}// 打印客户端的地址信息char ip[24] {0};printf(客户端的IP地址: %s, 端口: %d\n,inet_ntop(AF_INET, cliaddr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(cliaddr.sin_port));// 5. 和客户端通信while(1){// 接收数据char buf[1024];memset(buf, 0, sizeof(buf));int len read(cfd, buf, sizeof(buf));if(len 0){printf(客户端say: %s\n, buf);write(cfd, buf, len);}else if(len 0){printf(客户端断开了连接...\n);break;}else{perror(read);break;}}close(cfd);close(lfd);return 0;
}
client.c
// client.c
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include arpa/inet.hint main()
{// 1. 创建通信的套接字int fd socket(AF_INET, SOCK_STREAM, 0);if(fd -1){perror(socket);exit(0);}// 2. 连接服务器struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(10000); // 大端端口inet_pton(AF_INET, 10.0.2.15, addr.sin_addr.s_addr);int ret connect(fd, (struct sockaddr*)addr, sizeof(addr));if(ret -1){perror(connect);exit(0);}// 3. 和服务器端通信int number 0;while(1){// 发送数据char buf[1024];sprintf(buf, 你好, 服务器...%d\n, number);write(fd, buf, strlen(buf)1);// 接收数据memset(buf, 0, sizeof(buf));int len read(fd, buf, sizeof(buf));if(len 0){printf(服务器say: %s\n, buf);}else if(len 0){printf(服务器断开了连接...\n);break;}else{perror(read);break;}sleep(1); // 每隔1s发送一条数据}close(fd);return 0;
}