第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2021-04-05 本文由山色风月倦 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

//使用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

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新高等教育linux下一个多线程并发服务器的实例全文阅读和word下载服务。

linux下一个多线程并发服务器的实例.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1178603.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top