并发服务端有多线程的和多进程的,今天来看一下多线程的。线程编程可能会麻烦一点,其中涉及到一些同步,死锁问题,但是也有其优点。并发服务端用的多的还是多进程。
服务端:
#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)//创建线程
{
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;
}
经过编译,能运行。
[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