linux下多线程实现服务端
生活随笔
收集整理的這篇文章主要介紹了
linux下多线程实现服务端
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? 并發(fā)服務端有多線程的和多進程的,今天來看一下多線程的。線程編程可能會麻煩一點,其中涉及到一些同步,死鎖問題,但是也有其優(yōu)點。并發(fā)服務端用的多的還是多進程。
服務端:
?
#include<stdlib.h> #include<pthread.h> #include<sys/socket.h> #include<sys/types.h> #include<stdio.h> #include<iostream> #include<netinet/in.h> #include<arpa/inet.h> #include<string.h> #include<unistd.h>void *server_handle(void * sock_fd);int main() { int sockSrv;int sockConn;struct sockaddr_in addrSrv;struct sockaddr_in addrClient;socklen_t client_length;sockSrv = socket(AF_INET,SOCK_STREAM,0);memset(&addrSrv,0,sizeof(addrSrv));addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);addrSrv.sin_port = htons(8888); bind(sockSrv,(const struct sockaddr *)(&addrSrv),sizeof(struct sockaddr_in));listen(sockSrv,5);while(1){ pthread_t thread_id;client_length = sizeof(addrClient);sockConn = accept(sockSrv,(struct sockaddr *)(&addrClient),&client_length);if(pthread_create(&thread_id,NULL,server_handle,(void *)(&sockConn)) == -1)//創(chuàng)建線程{ printf("pthread_create error!\n");break;}}close(sockSrv);return 0; }void *server_handle(void * sock_fd) {int fd = *(int *)sock_fd;int recvBytes = 0;char recvBuf[1024];char sendBuf[50] = "Server has received your request!\n";while(1){memset(recvBuf,0,1024);recvBytes = read(fd,recvBuf,1024);printf("recvDate=%s\n",recvBuf);if(recvBytes == 0){printf("client closed\n");break;}if(recvBytes == -1){printf("read error!\n");break;}if(write(fd,sendBuf,strlen(sendBuf)) == -1){break;}}close(fd);pthread_exit(NULL);//線程退出 }客戶端:
?
?
#include<sys/socket.h> #include<netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <string.h>int main() {int sockClient = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(8888);connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));char sendBuf[100] = "123";char recvBuf[100];send(sockClient, sendBuf, strlen(sendBuf)+1, 0);printf("%s\n", sendBuf);recv(sockClient,recvBuf,sizeof(recvBuf),0);printf("recvBuf=%s\n",recvBuf);getchar();close(sockClient);return 0; }?
經(jīng)過編譯,能運行。
?
?
[mapan@localhost threadServer]$ ./server recvDate=123[mapan@localhost threadServer]$ ./client 123 recvBuf=Server has received your request!?
?
?
?
?
?
參考地址:https://www.cnblogs.com/nerohwang/p/3602233.html
多進程版本參看:http://blog.csdn.net/stpeace/article/details/75947203
總結
以上是生活随笔為你收集整理的linux下多线程实现服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下带超时的telnet探测
- 下一篇: CPU的充分利用