socket编程---之多连接服务端实现(多线程方式)
来源:互联网 发布:用友软件t3普及版安装 编辑:程序博客网 时间:2024/05/22 03:24
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/fcntl.h>#include <sys/select.h>#include <sys/time.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <pthread.h>#define Port 2125#define MAXQUEUE 5#define BUFFER_SIZE 1024#define SOCK_NULL -1void *rec_data(void *socketFD){ int client_sockfd; size_t byte; char char_recv[100];//存放数据 client_sockfd=*((int*)socketFD); for(;;) { if((byte=recv(client_sockfd,char_recv,sizeof(char_recv),0))==-1) { perror("recv"); exit(EXIT_FAILURE); } if(strcmp(char_recv, "exit")==0)//接受到exit时,跳出循环 break; printf("receive from client is %s\n",char_recv);//打印收到的数据 } free(socketFD); close(client_sockfd); pthread_exit(NULL);}int main(){ int server_sockfd; int *client_sockfd; // --每次获取到新的连接,都分配不同的内存来保存,这样不同的连接数据不会覆盖.当然也可以用一个数组来维护不同的客户端socket // --1. 创建一个服务端socket server_sockfd = socket(AF_INET,SOCK_STREAM, 0); if (server_sockfd == SOCK_NULL) { perror("socet create....\n"); exit(0); } // --2.定义基于internet通信的地址信息 sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(Port); server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // --htonl(INADDR_LOOPBACK) bzero(&server_sockaddr.sin_zero, sizeof(server_sockaddr.sin_zero)); // --3.bind,成功返回0,出错返回-1 int reuse; if (setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)) == -1){ perror("setsockopt"); exit(1); } if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } // --4.listen if(listen(server_sockfd,MAXQUEUE) == -1) { perror("listen"); exit(1); } // --5.不停的等待接受客户端的连接,每当获取一个连接时,创建一个子线程,用于处理和这个客户端的数据交互 while(1) { struct sockaddr_in client_add; socklen_t client_len = sizeof(client_add); client_sockfd = (int*)malloc(sizeof(int)); *client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_add,&client_len); if (*client_sockfd == SOCK_NULL) { perror("accept\n"); continue; } // --创建子线程 pthread_t client_thread; if(pthread_create(&client_thread, NULL, rec_data, client_sockfd) == -1){ // --第二个参数表示要创建线程的属性,NULL表示默认属性 perror("create thread\n"); break; } } close(server_sockfd); return 0;}
0 0
- socket编程---之多连接服务端实现(多线程方式)
- socket编程---之多连接服务端实现(select函数方式)
- socket编程---之多连接服务端实现(CFNetwork框架)
- Socket编程简单实现服务端客户端连接
- socket编程---之单连接服务端实现
- Java Socket编程之多线程实现C/S一对多(服务端无法发送数据)
- java socket编程,多线程,客户端服务端
- 多线程Socket编程实现服务器与客户端的连接
- JAVA SOCKET网络编程,服务端接收多个客户端连接的实现
- 网络编程--基于java socket通信,实现多个客户端连接同一服务端
- socket服务端-多线程
- socket服务端多线程
- 基于Socket的服务端的多线程模式编程案列
- Socket多连接服务端
- 使用多线程实现多客户端的连接(通过Socket实现TCP编程)
- socket通信服务端编程
- Android与服务端的Socket连接实现简单数据传输
- Android客户端 C#服务端 实现socket长连接
- Fragment创建及其生命周期
- 高效解析xml的总结,闲下来写的
- 论文写作中,propose,present,report,investigate等词语有什么不同的含义呢?
- 第7周项目3 撞错
- JSON 数据格式
- socket编程---之多连接服务端实现(多线程方式)
- 题目1437:To Fill or Not to Fill 题目25
- JAVA进阶-泛型
- 睿晟微电子(苏州)面试回忆
- Linux 需要交叉编译的ntp配置
- java反射机制了解
- 下拉框封装
- (转载)Toast的五种效果
- HttpClient 认证机制