多线程并发服务器的模型就是对每个连接请求创建一个线程来处理。
服务器端功能还是将客户端发过来的字符串中的小写字母全部转化为大学字母后发回客户端。客户端采用 linux多进程并发服务模型 中客户端的程序。
服务端代码如下:
- #include <stdio.h>
- #include <stdlib.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>
- typedef struct {
- int connectfd;
- struct sockaddr_in client;
- }targs;
- void *process(void *arg){
- targs client;
- client.connectfd=((targs *)arg)->connectfd;
- client.client=((targs *)arg)->client;
- char buf[1024];
- int n=0;
- while(0<(n=read(client.connectfd,buf,sizeof(buf)))){
- buf[n]='\0';
- printf("You got a message <%s> from %s.\n",buf,inet_ntoa(client.client.sin_addr));
- int i=0;
- while(buf[i]!='\0'&&i<1024){
- if(buf[i]>='a'&&buf[i]<='z')
- buf[i]+=('A'-'a');
- i++;
- }
- write(client.connectfd,buf,strlen(buf));
- }
- close(client.connectfd);
- }
- #define PORT 1111
- #define BACKLOG 5
- int main(){
- int listenfd,connectfd;
- struct sockaddr_in server;
- struct sockaddr_in client;
- if(-1==(listenfd=socket(AF_INET,SOCK_STREAM,0))){
- perror("create socket error\n");
- exit(1);
- }
- int opt=SO_REUSEADDR;
- setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
- bzero(&server,sizeof(server));
- server.sin_family=AF_INET;
- server.sin_port=htons(PORT);
- server.sin_addr.s_addr=htonl(INADDR_ANY);
- if(-1==(bind(listenfd,(struct sockaddr*)&server,sizeof(struct sockaddr)))){
- perror("bind error\n");
- exit(1);
- }
- if(-1==(listen(listenfd,BACKLOG))){
- perror("listen error\n");
- exit(1);
- }
- int len=sizeof(client);
- targs arg;
- while(1){
- if(-1==(connectfd=accept(listenfd,(struct sockaddr *)&client,&len))){
- perror("accept error\n");
- exit(1);
- }
- arg.connectfd=connectfd;
- arg.client=client;
- pthread_t tid;
- if(pthread_create(&tid,NULL,process,(void *)&arg)){
- perror("create thread error\n");
- exit(1);
- }
- }
- close(listenfd);
- return 0;
- }
这只是一个简单的模型,没有考虑到线程安全等等问题。用gcc编译的时候,要加参数-lpthread。
阅读(5515) | 评论(0) | 转发(0) |