linux下一个多线程并发服务器的实例

山色风月倦 分享 2021-04-05 下载文档

//使用pthread线程库

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>

#define PORT 1234 //服务器端口
#define BACKLOG 5 //listen队列等待的连接数
#define MAXDATASIZE 1024 //缓冲区大小

void process_cli(int connectfd, struct sockaddr_in client); //客户端请求处理函数
void* start_routine(void* arg); //线程函数

typedef struct _ARG {
int connfd;
struct sockaddr_in client;
}ARG; //客户端结构体

main()
{
int listenfd, connectfd; //socket描述符
pthread_t thread; //线程体变量
ARG *arg; //客户端结构体变量
struct sockaddr_in server; //服务器地址信息结构体
struct sockaddr_in client; //客户端地址信息结构体
int sin_size;

if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //调用socket,创建监听客户端的socket
perror("Creating socket failed.");
exit(1);
}

int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置socket属性,端口可以重用
//初始化服务器地址结构体
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);

if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { //调用bind,绑定地址和端口
perror("Bind error.");
exit(1);
}

if(listen(listenfd,BACKLOG) == -1){ //调用listen,开始监听
perror("listen() error\n");
exit(1);
}

sin_size=sizeof(struct sockaddr_in);

while(1)
{
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,(socklen_t *)&sin_size))==-1) {
//调用accept,返回与服务器连接的客户端描述符
perror("accept() error\n");
exit(1);
}

arg = new ARG;
arg->connfd = connectfd;
memcpy(&arg->client, &client, sizeof(client));

if (pthread_create(&thread, NULL, start_routine, (void*)arg)) { //创建线程,以客户端连接为参数,start_routine为线程执行函数
perror("Pthread_create() error");
exit(1);
}
}
close(listenfd); //关闭监听socket
}

void process_cli(int connectfd, sockaddr_in client)
{
int num;
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];

printf("You got a connection from %s. ",inet_ntoa(client.sin_addr) );
num = recv(connectfd, cli_name, MAXDATASIZE,0);
if (num == 0) {
close(connectfd);
printf("Client disconnected.\n");
return;
}
cli_name[num - 1] = '\0';
printf("Client's name is %s.\n",cli_name);

while (num = recv(connectfd, recvbuf, MAXDATASIZE,0)) {
recvbuf[num] = '\0';
printf("Received client( %s ) message: %s",cli_name, recvbuf);
for (int i = 0; i < num - 1; i++) {
sendbuf[i] = recvbuf[num - i


linux下一个多线程并发服务器的实例.doc 将本文的Word文档下载到电脑

下一篇:劳务员实务

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx