socket编程与线程的结合

Posted 五个板栗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket编程与线程的结合相关的知识,希望对你有一定的参考价值。

一、设计思路

       我们已经学会了简单的socket编程和线程的概念,并在前期博客中完成了socket编程中服务器端将小写转为大写的实现,那么如果多个客户端同时连接服务器呢?并且每个客户端能够持续得到服务器的响应,又该如何实现呢?只需要再创建一个子线程,让子线程去读取客户端发送的数据,然后处理客户端的请求。

二、设计流程

      在以前图一的基础上,创建子进程,将读取和处理数据交给子进程处理,由子进程转换得到图二

socket编程与线程的结合_服务器

三、代码实现

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

#define SERV_PORT 8000

void err(const char *str)

perror(str);
exit(1);

void *function(void *arg)

int i;
int ret;
int cfd=*(int *)arg;
//int ccfd=0;
char buf[BUFSIZ];
while(1)

ret=read(cfd,buf,sizeof(buf));
//读取客户端发送的数据
write(STDOUT_FILENO,buf,ret);
for(i=0;i<ret;i++)
buf[i]=toupper(buf[i]);
//处理客户端发送的数据
write(cfd,buf,ret);



int main()

pthread_t tid;
int ret,i;
int sfd=0;
int cfd=0;
char buf[BUFSIZ];
struct sockaddr_in serv_addr,cli_addr;
socklen_t cli_addr_len;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERV_PORT);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//初始化服务器地址结构
sfd=socket(AF_INET,SOCK_STREAM,0);
//创建一个socket,指定IPv4协议族
if(sfd==-1)

err("socket error");

bind(sfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
//绑定服务器的地址结构
listen(sfd,128);
//设置监听上限,此处不阻塞等待
cli_addr_len=sizeof(cli_addr);
//获取客户端地址结构的大小
while(1)

cfd=accept(sfd,(struct sockaddr *)&cli_addr,&cli_addr_len);
if(cfd==-1)

err("accept error");

int *fd=malloc(sizeof(int));//动态申请4个字节内存
if(!fd)

perror("malloc");
continue;

*fd=cfd;
int mid=pthread_create(&tid,NULL,function,fd);//创建子进程
if(mid!=0)

free(fd);
err("pthread error");



close(sfd);
close(cfd);
return 0;

四、结果显示

客户端1

socket编程与线程的结合_客户端_02

socket编程与线程的结合_套接字_03

客户端2

socket编程与线程的结合_线程_04

客户端3

socket编程与线程的结合_服务器_05

服务器

socket编程与线程的结合_客户端_06

以上是关于socket编程与线程的结合的主要内容,如果未能解决你的问题,请参考以下文章

Liunx C 编程之多线程与Socket

廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

tcp与线程结合

socket 编程中。 服务端用到多线程

Socket 多线程编程

将 Greenleets 与 Flask 和标准线程相结合