您的位置:首页 > 编程语言

多进程、多线程并发服务器代码

2016-09-08 20:37 381 查看
1.单进程服务器:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>

#define SERV_PORT 8888

int std_err(const char* name)
{
perror(name);
exit(1);
}

int main(void)
{
int sfd, cfd, ret;
int len;
socklen_t clie_len;
char buf[BUFSIZ];
//创建服务器套节字
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
std_err("socket");
//定义地址类型
struct sockaddr_in serv_addr, clie_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

//绑定服务器的IP、端口;
ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
std_err("bind");

//监听链接服务器的客户数量
ret = listen(sfd, 99);
if(ret == -1)
std_err("listen");
clie_len = sizeof(clie_addr);
//阻塞等待客户端发起链接请求
cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len);
if(cfd == -1)
std_err("accept");

//传输数据
while(1)
{
len = read(cfd, buf, sizeof(buf));
printf("server: %s\n", buf);
int i;
for(i = 0; i < len; i++)
buf[i] = toupper(buf[i]);
write(cfd, buf, len);
}
close(sfd);
close(cfd);
return 0;
}


2.单客户端

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>

#define SERV_PORT 8888

int std_err(const char* name)
{
perror(name);
exit(1);
}

int main(void)
{
int cfd, ret, serv_IP;
char buf[BUFSIZ];
//创建套节字
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(cfd == -1)
std_err("socket");
//定义IP , 端口
struct sockaddr_in clie_addr;
clie_addr.sin_family = AF_INET;
clie_addr.sin_port = htons(SERV_PORT);
//转换IP 字符串的地址
ret = inet_pton(AF_INET, "192.168.22.251", &serv_IP);
if(ret != 1)
std_err("inet_pton");
clie_addr.sin_addr.s_addr = serv_IP;
//链接服务器
ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));
if(ret == -1)
std_err("connect");
// 传输数据
while(1)
{
int len = read(STDIN_FILENO, buf, sizeof(buf));
printf("cliet_len: %d\n", len);

write(cfd, buf, len);
len = read(cfd, buf, sizeof(buf));
printf("serve_len: %d\n", len);
printf("%s",buf);
//write(STDOUT_FILENO, buf, len);
}
//关闭套节字
close(cfd);
return 0;

}


3.多进程服务器

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<errno.h>
#include<sys/wait.h>
#include<errno.h>

#define SERV_PORT 8883

int std_err(const char* name)
{
perror(name);
exit(1);
}

void do_sth_child(int signum)
{

while(waitpid(0, NULL, WNOHANG) < 0)
;

}

int main(void)
{
int sfd, cfd, ret;
int len;
pid_t pid;
socklen_t clie_len;
char buf[BUFSIZ], clibuf[32];
//创建服务器套节字
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
std_err("socket");
//定义地址类型
struct sockaddr_in serv_addr, clie_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

//绑定服务器的IP、端口;
ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
std_err("bind");

//监听链接服务器的客户数量
ret = listen(sfd, 99);
if(ret == -1)
std_err("listen");
clie_len = sizeof(clie_addr);
while(1)
{
//阻塞等待客户端发起链接请求
cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len);
printf("client IP :%s, port: %d\n",
inet_ntop(sfd, &clie_addr.sin_addr.s_addr, clibuf, sizeof(clibuf)),
ntohs(clie_addr.sin_port) );
if(cfd == -1)
std_err("accept");
pid = fork();
if(pid < 0)
std_err("fork:");
else if(pid == 0)
{
close(sfd);
break;
}
else        //住进程实现逻辑;1.回收子进程,2,关闭不必要的文件描述父 3,继续等待客户端链接,如果有,则继续创建子进程
{
close(cfd);
signal(SIGCHLD, do_sth_child);
}
}
if(pid == 0)
{
agian:
//子进程传输数据
while(1)
{
len = read(cfd, buf, sizeof(buf));
if(len == 0)    //即客户端关闭通信,
{
close(cfd);
exit(1);
}
else if( len == -1)
{
if(errno == EINTR)
{
goto agian;
}
else
{
std_err("read:");
}
}
else
{
int i;
for(i = 0; i < len; i++)
buf[i] = toupper(buf[i]);
write(cfd, buf, len);
write(STDOUT_FILENO, buf, len);
}
}
}

return 0;
}


4.多个客户端(一段代码产生多个客户端)

  1.当时编写这段代码的作用是撑爆老师的服务器

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<strings.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/wait.h>
#include<signal.h>
#include<errno.h>
#include<pthread.h>
#include <pthread.h>

#define SERV_PORT 8883
#define SERV_IP "127.0.0.1"
int std_err(const char* name)
{
perror(name);
exit(1);
}
void do_sth_child(int signum)
{
while(waitpid(0, NULL, WNOHANG) > 0);
}

int main(void)
{
int cfd, ret;
char buf[BUFSIZ];
pid_t pid;
//pthread_mutexattr_t mattr;
//pthread_mutexattr_init(&mattr);
//pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
//pthread_mutex_t mutex;
//pthread_mutex_init(&mutex, &mattr);

int i;
for(i = 0; i < 6; i++){
pid = fork();
if(pid == 0)
break;
else if(pid < 0)
std_err("fork");
else
{
// close(cfd);
signal(SIGCHLD, do_sth_child);
}
}

//子进程逻辑
if(pid == 0)
{
//创建套节字
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(cfd == -1)
std_err("socket");
//定义IP , 端口
struct sockaddr_in clie_addr;
clie_addr.sin_family = AF_INET;
clie_addr.sin_port = htons(SERV_PORT);
//转换IP 字符串的地址
ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr);
if(ret != 1)
std_err("inet_pton");
//pthread_mutex_lock(&mutex);
//链接服务器
ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));
if(ret == -1)
std_err("connect");
// 传输数据
// while(1)
{
int len;
again:
//char bufstr[10] = "sdasdasd";
len = read(STDIN_FILENO, buf, sizeof(buf));
if(len < 0)
{
if(errno == EAGAIN || errno == EINTR)
goto again;
else
std_err("read");
}
write(cfd, buf, len);
//write(cfd, bufstr, sizeof(bufstr));
//len = read(cfd, buf, sizeof(buf));
//printf("serve_len: %d\n", len);
//printf("%s",buf);
write(STDOUT_FILENO, buf, len);
}
//pthread_mutex_unlock(&mutex);
}
while(1);
//关闭套节字
close(cfd);
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: