自贡公司做网站,宁波网站搭建定制非模板网站建设,网站申请空间,ps做的网站模板全双工#xff1a; 通信双方 既可以发送#xff0c;也可以接收数据 1. 利用多线程 或者 多进程#xff0c; 实现TCP服务器 和 客户端的全双工通信
思路#xff1a;
服务器和客户端#xff0c; 在建立通信以后#xff0c;可以创建线程#xff0c;在线程编写另一个功能代… 全双工 通信双方 既可以发送也可以接收数据 1. 利用多线程 或者 多进程 实现TCP服务器 和 客户端的全双工通信
思路
服务器和客户端 在建立通信以后可以创建线程在线程编写另一个功能代码
客户端参考
pthread_handler()
{while(1){fgets();send(); }
}main()
{socket();connect();pthread_create();while(1){recv(); }
}服务器参考
pthread_handler()
{while(1){ fgets();send(); }
}main()
{socket();bind();listen();accept();pthread_create();while(1){recv(); }
} 客户端示例代码
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/socket.h
#include arpa/inet.h
#include pthread.h#define BUFFER_SIZE 1024// 接收线程函数
void *client_recv_thread(void *arg) {int sock *(int *)arg; // 从参数中获取socket描述符char buffer[BUFFER_SIZE]; // 用于接收数据的缓冲区while (1) {memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区ssize_t bytes_received recv(sock, buffer, BUFFER_SIZE - 1, 0); // 接收数据if (bytes_received 0) {perror(接收数据失败);break; // 如果接收失败结束线程}printf(收到信息: %s, buffer); // 打印接收到的信息}pthread_exit(NULL); // 结束线程
}int main() {int sock; // 客户端socket描述符struct sockaddr_in server; // 服务器地址结构char buffer[BUFFER_SIZE]; // 用于发送数据的缓冲区sock socket(AF_INET, SOCK_STREAM, 0); // 创建socketif (sock -1) {perror(无法创建socket);return 1;}server.sin_addr.s_addr inet_addr(127.0.0.1); // 设置服务器IP地址server.sin_family AF_INET; // 设置为Internet协议族server.sin_port htons(8888); // 设置服务器端口if (connect(sock, (struct sockaddr *)server, sizeof(server)) 0) { // 连接到服务器perror(连接失败);return 1;}pthread_t thread_id; // 线程IDif (pthread_create(thread_id, NULL, client_recv_thread, sock) ! 0) { // 创建接收线程perror(创建线程失败);return 1;}while (1) { // 主循环用于发送数据printf(输入信息: );fgets(buffer, BUFFER_SIZE, stdin); // 从标准输入读取一行send(sock, buffer, strlen(buffer), 0); // 发送数据}close(sock); // 关闭socketreturn 0;
}
服务器代码
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/socket.h
#include arpa/inet.h
#include pthread.h#define MAX_THREADS 10
#define BUFFER_SIZE 1024// 接收线程函数
void *server_recv_thread(void *arg) {int sock *(int *)arg; // 从参数中获取socket描述符char buffer[BUFFER_SIZE]; // 用于接收数据的缓冲区while (1) {memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区ssize_t bytes_received recv(sock, buffer, BUFFER_SIZE - 1, 0); // 接收数据if (bytes_received 0) {perror(接收数据失败);break; // 如果接收失败结束线程}printf(收到信息: %s, buffer); // 打印接收到的信息}pthread_exit(NULL); // 结束线程
}int main() {int sock, client_sock; // 服务器socket描述符客户端socket描述符struct sockaddr_in server, client; // 服务器和客户端地址结构pthread_t thread_id; // 线程IDsock socket(AF_INET , SOCK_STREAM , 0); // 创建socketif (sock -1) {perror(无法创建socket);return 1;}server.sin_family AF_INET; // 设置为Internet协议族server.sin_addr.s_addr INADDR_ANY; // 监听所有可用接口server.sin_port htons(8888); // 设置服务器端口if (bind(sock, (struct sockaddr *)server , sizeof(server)) 0) { // 绑定socketperror(绑定失败);return 1;}listen(sock, 3); // 开始监听连接printf(等待接收连接...\n);while (1) { // 主循环用于接受新连接socklen_t len sizeof(struct sockaddr_in); // 地址长度client_sock accept(sock, (struct sockaddr *)client, len); // 接受连接if (client_sock 0) {perror(接受连接失败);return 1;}if (pthread_create(thread_id, NULL, server_recv_thread, client_sock) ! 0) { // 创建接收线程perror(创建线程失败);return 1;}}close(sock); // 关闭socketreturn 0;
} TCP建立的初衷是 1 对 1 的通信 其本身机制无法完成并发服务器 只能借助其他方法。。。。。 这里不要求实现全双工 2. 利用多线程 或者 多进程实现TCP服务器 可以同时跟多个客户端通信(并发服务器)
思路
每次accept建立通信 服务器都创建一个专属的线程任务与客户端通信
服务器在通信时主要依靠的是acceptfd每次acceptfd的值都代表不同的通信套接字
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/socket.h
#include arpa/inet.h
#include pthread.h#define MAX_THREADS 10 // 线程池中线程的最大数量
#define BUFFER_SIZE 1024 // 缓冲区大小// 客户端信息结构体
typedef struct {int sock; // 客户端socket描述符
} client_info;// 客户端处理线程函数
void *handle_client(void *arg) {client_info *info (client_info *)arg; // 从参数中获取客户端信息int client_sock info-sock; // 获取客户端socketchar buffer[BUFFER_SIZE]; // 缓冲区用于接收和发送数据// 循环接收并处理客户端数据while (1) {memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区ssize_t bytes_received recv(client_sock, buffer, BUFFER_SIZE - 1, 0); // 接收数据if (bytes_received 0) {printf(客户端断开连接\n);close(client_sock); // 如果客户端断开关闭socketfree(info); // 释放客户端信息结构体pthread_exit(NULL); // 结束线程} else {printf(接收到客户端信息: %s, buffer); // 打印接收到的信息send(client_sock, buffer, bytes_received, 0); // 将接收到的数据原样返回给客户端}}
}int main() {int sock, client_sock; // 服务器和客户端socket描述符struct sockaddr_in server, client; // 服务器和客户端地址信息pthread_t thread_id[MAX_THREADS]; // 线程ID数组int active_threads 0; // 当前线程数量// 创建服务器socketsock socket(AF_INET, SOCK_STREAM, 0);if (sock -1) {perror(无法创建socket);return 1;}// 设置服务器地址信息server.sin_family AF_INET;server.sin_addr.s_addr INADDR_ANY;server.sin_port htons(8888);// 绑定服务器地址if (bind(sock, (struct sockaddr *)server, sizeof(server)) 0) {perror(绑定失败);return 1;}// 开始监听连接listen(sock, 3);printf(等待接收连接...\n);// 主循环用于接受新连接while (1) {socklen_t len sizeof(struct sockaddr_in);client_sock accept(sock, (struct sockaddr *)client, len);if (client_sock 0) {perror(接受连接失败);continue;}// 检查线程池是否已满if (active_threads MAX_THREADS) {printf(线程数量已达到上限拒绝连接\n);close(client_sock); // 如果线程池已满关闭新连接的socketcontinue;}// 分配并初始化客户端信息结构体client_info *info malloc(sizeof(client_info));info-sock client_sock;// 创建线程处理新连接if (pthread_create(thread_id[active_threads], NULL, handle_client, info) ! 0) {perror(创建线程失败);continue;}// 增加活动线程数量active_threads;}// 等待所有线程结束for (int i 0; i active_threads; i) {pthread_join(thread_id[i], NULL);}// 关闭服务器socketclose(sock);// 正常退出return 0;
}
文章转载自: http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn http://www.morning.ckhyj.cn.gov.cn.ckhyj.cn http://www.morning.snyqb.cn.gov.cn.snyqb.cn http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn http://www.morning.nwynx.cn.gov.cn.nwynx.cn http://www.morning.ksgjy.cn.gov.cn.ksgjy.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.xjwtq.cn.gov.cn.xjwtq.cn http://www.morning.lbggk.cn.gov.cn.lbggk.cn http://www.morning.nrqnj.cn.gov.cn.nrqnj.cn http://www.morning.qnkqk.cn.gov.cn.qnkqk.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.qpmmg.cn.gov.cn.qpmmg.cn http://www.morning.fwrr.cn.gov.cn.fwrr.cn http://www.morning.tgyzk.cn.gov.cn.tgyzk.cn http://www.morning.nbpqx.cn.gov.cn.nbpqx.cn http://www.morning.sflnx.cn.gov.cn.sflnx.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.nkcfh.cn.gov.cn.nkcfh.cn http://www.morning.rfyk.cn.gov.cn.rfyk.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.drggr.cn.gov.cn.drggr.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.xwqxz.cn.gov.cn.xwqxz.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.cprbp.cn.gov.cn.cprbp.cn http://www.morning.jbxmb.cn.gov.cn.jbxmb.cn http://www.morning.hwpcm.cn.gov.cn.hwpcm.cn http://www.morning.kxqmh.cn.gov.cn.kxqmh.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn http://www.morning.rnqyy.cn.gov.cn.rnqyy.cn http://www.morning.gthwr.cn.gov.cn.gthwr.cn http://www.morning.gkjyg.cn.gov.cn.gkjyg.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.pwdrc.cn.gov.cn.pwdrc.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.ftmly.cn.gov.cn.ftmly.cn http://www.morning.cgbgc.cn.gov.cn.cgbgc.cn http://www.morning.yrsg.cn.gov.cn.yrsg.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.rzmlc.cn.gov.cn.rzmlc.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.dpjtn.cn.gov.cn.dpjtn.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.znknj.cn.gov.cn.znknj.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.ywpcs.cn.gov.cn.ywpcs.cn http://www.morning.chongzhanggui.cn.gov.cn.chongzhanggui.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.rgkd.cn.gov.cn.rgkd.cn http://www.morning.rjnm.cn.gov.cn.rjnm.cn http://www.morning.heleyo.com.gov.cn.heleyo.com http://www.morning.qtfss.cn.gov.cn.qtfss.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.fldrg.cn.gov.cn.fldrg.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.npmpn.cn.gov.cn.npmpn.cn http://www.morning.qyfqx.cn.gov.cn.qyfqx.cn http://www.morning.rxtxf.cn.gov.cn.rxtxf.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.jkszt.cn.gov.cn.jkszt.cn http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.csgwd.cn.gov.cn.csgwd.cn http://www.morning.qrksj.cn.gov.cn.qrksj.cn http://www.morning.rqwwm.cn.gov.cn.rqwwm.cn http://www.morning.lxjxl.cn.gov.cn.lxjxl.cn http://www.morning.fqqcn.cn.gov.cn.fqqcn.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn