多线程的实现
来源:互联网 发布:淘宝焊接阀门 编辑:程序博客网 时间:2024/04/29 08:41
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/ip.h>#include <arpa/inet.h>#include <pthread.h>void * client(void *arg)//connfd;{int connfd;int ret;char buf[256];connfd = *(int *)arg;while(1) {memset(buf, 0, sizeof(buf));ret = read(connfd, buf, sizeof(buf));if (ret == -1) {perror("server->read");pthread_exit(NULL);} else if (ret == 0) {close(connfd);pthread_exit(NULL);}printf("buf : %s\n", buf);ret = write(connfd, buf, sizeof(buf));if (ret == -1) {perror("server->write");pthread_exit(NULL);}}pthread_exit(NULL);}void fun(int sig) {printf("client quit\n");while(waitpid(-1, NULL, WNOHANG) > 0);}int main(int argc, char *argv[]){int listenfd;int ret;socklen_t addrlen;int connfd;pid_t pid;char buf[256];struct sockaddr_in srvaddr;struct sockaddr_in cltaddr;pthread_t client_pthread;/* 1. 创建服务器(创建一socket套接字);socket */listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1) {perror("server->socket");return -1;}printf("create listenfd = %d success\n", listenfd);/* 2. 设置服务器的IP地址和端口号(将socket和服务器的IP地址和端口号进行绑定);bind */memset(&srvaddr, 0, sizeof(struct sockaddr_in));srvaddr.sin_family = AF_INET;srvaddr.sin_port = htons(9999);srvaddr.sin_addr.s_addr = inet_addr("192.168.2.100");ret = bind(listenfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));printf("port : %d\n", ntohs(srvaddr.sin_port));if (ret == -1) {perror("server->bind");return -1;}printf("bind success !\n");/* 3. 启动监听(启动服务器); listen */ret = listen(listenfd, 1024);if (ret == -1) {perror("server->listen");return -1;}printf("listen success !\n");while(1) {/* 4. 等待服务器的连接请求,如果没有连接请求则等待,如果有连接请求,则建立连接; accept */memset(&cltaddr, 0, sizeof(cltaddr));addrlen = sizeof(cltaddr);connfd = accept(listenfd, (struct sockaddr *)&cltaddr, &addrlen);if (connfd == -1) {perror("server->accept");return -1;}printf("connect connfd = %d\n", connfd);printf("IP : %s\n", inet_ntoa(cltaddr.sin_addr));printf("PORT: %d\n", ntohs(cltaddr.sin_port));/* 创建一个子线程,处理客户端的请求*/ret = pthread_create(&client_pthread, NULL, client, (void *)&connfd);if (ret != 0) {printf("create client pthread fail\n");return -1;} printf("create client_pthread = %d success\n", (int)client_pthread);ret = pthread_detach(client_pthread);if (ret != 0) {printf("detach client pthread fail\n");return -1;} printf("detach cltaddr pthread success\n");}close(listenfd);return 0;}
阅读全文
0 0
- 多线程、多线程的实现、多线程的生命周期
- 多线程、多线程的实现、多线程的生命周期
- Java 多线程(多线程的实现)
- 多线程断点续传的实现
- 多线程的实现方法
- WPF多线程的实现
- 多线程的实现
- 多线程的实现
- Java 多线程的实现
- pb多线程的实现
- Java多线程的实现
- 多线程的实现
- C#多线程的实现
- delphi多线程的实现
- java多线程的实现
- java多线程的实现
- JAVA多线程的实现
- 多线程实现的总结
- 第三周——项目一—顺序表的基本运算(1)
- Linux 应用---make及makefile的编写
- Python机器学习Sklearn入门案例(下)
- redis中文乱码
- Java web开发问题整理
- 多线程的实现
- thymeleaf 学习笔记-基础篇(中文教程)
- Spring技术内幕——DataSourceTransactionManager
- leetcod addboldtag Java
- 浅谈最小生成树kruskal算法的定义与应用
- GAWK命令内建变量的使用
- HTML——网页设计基础
- C++设计模式之外观模式
- 在AndroidStudio集成Mapbox