0703 socket服务器多线程处理客户请求

 1 /*************************************************************************
 2     > File Name: my_socket.h
 3     > Author:Monica
 4     > Mail:[email protected]
 5     > Created Time: Thu 03 Jul 2014 10:40:54 AM CST
 6  ************************************************************************/
 7
 8 #ifndef __MY_SOCKET_H__
 9 #define __MY_SOCKET_H__
10
11 #include <stdio.h>
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <sys/stat.h>
15 #include <arpa/inet.h>
16 #include <netinet/in.h>
17 #include <fcntl.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <unistd.h>
21 #include "msg.h"
22
23 int listenfd_init(char* ip, char* port);
24
25
26 #endif
 1 /*************************************************************************
 2     > File Name: server.c
 3     > Author: Monica
 4     > Mail:[email protected]
 5     > Created Time: Thu 03 Jul 2014 10:02:48 AM CST
 6  ************************************************************************/
 7
 8 #include  "my_socket.h"
 9
10 int listenfd_init(char* ip, char* port){
11
12     int fd_server;
13     int reuse = 1 ;
14     struct sockaddr_in server_addr;
15     fd_server = socket(AF_INET,SOCK_STREAM, 0);
16     if(fd_server == -1)
17     {
18         perror("socket");
19         exit(-1);
20     }
21     if(setsockopt(fd_server,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)) == -1)
22     {
23         perror("setsockopt");
24         close(fd_server);
25         exit(-1);
26     }
27     memset(&server_addr, 0 , sizeof(server_addr)) ;
28     server_addr.sin_family = AF_INET ;
29     server_addr.sin_port = htons(atoi(port));
30     server_addr.sin_addr.s_addr = inet_addr(ip);
31     if( bind(fd_server,(struct sockaddr*)&server_addr,sizeof(server_addr)) == -1)
32     {
33         perror("bind");
34         close(fd_server);
35         exit(-1);
36     }
37     if(listen(fd_server,5) == -1)
38     {
39         perror("listen");
40         close(fd_server);
41         exit(-1);
42     }
43     return fd_server;
44 }
 1 #include "my_socket.h"
 2
 3 void  * thread_handle(void* fd_client);
 4 int main(int argc , char* argv[])//exe ip port
 5 {
 6     int fd_server,fd_client;
 7     struct sockaddr_in server_addr,client_addr ;
 8     int addrlen = sizeof(client_addr);
 9     int tid;
10     if(argc != 3)
11     {
12         printf("usge : exe ip port");
13         exit(-1);
14     }
15     fd_server = listenfd_init(argv[1], argv[2]);
16     while(fd_client = accept(fd_server,(struct sockaddr*)&client_addr,&addrlen)){
17         printf("a client connect IP:%s\tPORT:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
18         pthread_create(&tid, NULL, thread_handle, (void *)fd_client);
19     }
20     close(fd_server);
21     return 0;
22 }
23 void*  thread_handle(void* fd_client){
24     pthread_detach(pthread_self());
25     MSG recv_msg, snd_msg;
26     int read_n;
27     int fd_file;
28     int fd_cli = (int)fd_client;
29     memset(&recv_msg, 0, sizeof(recv_msg));
30     recv(fd_cli, &recv_msg.s_len, MSG_LEN , 0) ;
31     recv(fd_cli, recv_msg.s_buf, recv_msg.s_len, 0) ;
32     printf("recv msg :%s\n", recv_msg.s_buf);
33     fd_file = open(recv_msg.s_buf, O_RDONLY);
34     while(memset(&snd_msg, 0, sizeof(snd_msg)), (read_n =  read(fd_file, snd_msg.s_buf, MSG_SIZE)) > 0)
35     {
36         snd_msg.s_len = read_n ;
37         send(fd_cli, &snd_msg, snd_msg.s_len + MSG_LEN ,0);
38     }
39     snd_msg.s_len = 0 ;
40     send(fd_cli, &snd_msg, snd_msg.s_len + MSG_LEN ,0);
41     close(fd_file);
42     close(fd_cli);
43 }
 1 /*************************************************************************
 2     > File Name: client.c
 3     > Author:Monica
 4     > Mail:[email protected]
 5     > Created Time: Thu 03 Jul 2014 10:46:20 AM CST
 6  ************************************************************************/
 7
 8 #include "my_socket.h"
 9 int main(int argc, char* argv[]){
10     int fd_client;
11     struct sockaddr_in  server_addr;
12     MSG recv_msg, snd_msg;
13     int fd_file;
14     int recv_len = 0 ;
15     char filename[128];
16     server_addr.sin_family = AF_INET;
17     server_addr.sin_addr.s_addr  = inet_addr(argv[1]);
18     server_addr.sin_port   = htons(atoi(argv[2]));
19     if((fd_client = socket(AF_INET, SOCK_STREAM, 0)) == -1){
20         perror("socket");
21         exit(-1);
22     }
23     if(connect(fd_client, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
24         perror("connect");
25         close(fd_client);
26         exit(-1);
27     }
28     printf("inputs filename:");
29     scanf("%s", snd_msg.s_buf);
30     snd_msg.s_len = strlen(snd_msg.s_buf);
31     send(fd_client,&snd_msg, snd_msg.s_len+MSG_LEN, 0 );
32     sprintf(filename, "download_%s", snd_msg.s_buf);
33     fd_file = open(filename, O_WRONLY|O_CREAT, 0666);
34     while(1){
35         printf("begin recv\n");
36         memset(&recv_msg, 0, sizeof(recv_msg));
37         recv(fd_client, &recv_msg.s_len, MSG_LEN, 0);
38         if(recv_msg.s_len >0){
39             recv(fd_client, recv_msg.s_buf, MSG_SIZE, 0);
40             write(fd_file, recv_msg.s_buf, strlen(recv_msg.s_buf));
41             recv_len += recv_msg.s_len;
42             printf("download...%d\n", recv_len);
43         }
44         else{
45             break;
46         }
47     }
48     close(fd_file);
49     close(fd_client);
50     return 0;
51 }

0703 socket服务器多线程处理客户请求

时间: 2024-11-07 00:54:39

0703 socket服务器多线程处理客户请求的相关文章

socket + pcntl_fork 实现客户端请求,服务器实时监听返回处理 消息推送

<?php /* socket链接整个过程 1,socket_create 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET: 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM.数据报套接字类型为SOCK_DGRAM.原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部): 第三个参数指定应用程序所使用的通信协议.此参数可以指定单个协议系列中的不同传输协议.在Inter

UNIX网络编程卷1 服务器程序设计范式6 并发服务器,为每个客户请求创建一个线程

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.为每个客户请求创建一个线程,以取代为每个客户派生一个子进程 /* include serv06 */ #include "unpthread.h" int main(int argc, char **argv) { int listenfd, connfd; void sig_int(int); void *doit(void *); pthread_t tid; sockl

java 利用NIO建立Socket服务器

Socket的Channel在Selector上注册某一种动作,Selector通过select操作,监视所有在该Selector注册过的Channel的对应的动作,如果监测到某一对应的动作,则返回selectedKeys,自己手动取到各个SelectionKey进行相应的处理.当然NIO不仅可以接受Socket的Channel,还有文件操作等其他IO操作. AD: WOT2015 互联网运维与开发者大会 热销抢票 传统的Java 的IO,利用Socket建立服务器,接收客户端连接,一般都是为每

C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux中有poll和epoll来实现,在windows下面 微软MSDN中也提供了SocketAsyncEventArgs这个类来

Java网络编程TCP程序,服务器和客户机交互流程以及基本操作步骤。

1.什么是网络编程 网络编程其实就是实现两个计算机的数据交换(交互). 可以通过直接或间接的通过网络协议与其他的计算机进行通讯.(HTTP协议,TCP/IP协议等) 2.Tcp网络编程的实现流程 主要分为服务器端(Server)和客户端(Client). 通过这个图我们其实就可以了解了实现服务器和客户机交互过程是怎么样的了. 实现这些原理最重要的是Socket类也叫做套接字.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 服务器端 1.首先创建ServerSocket对象并

利用ScktSrvr打造多功能Socket服务器

Socket服务端编程中最重要的也是最难处理的工作便是客户请求的处理和数据的接收和发送,如果每一个Socket服务器应用程序的开发都要从头到尾处理这些事情的话,人将会很累,也会浪费大量时间.试想,如果有一个通用的程序把客户请求处理和数据的接收.发送都处理好了,程序员只需要在不同的应用中对接收到的数据进行不同的解析并生成返回的数据包,再由这个通用程序将数据包传回客户端,这样,程序设计的工作将会轻松许多.  用Delphi进行过三层数据库应用开发的程序员一定对Borland公司的Borland So

Python拾忆--多线程的socket服务器

阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~ 记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最后章节讲的socket套接字那部分,第一次看到同时打开多个黑底白字的shell界面的样子,那么的激动T.T~那个时候还不知道什么是多线程,一个客户端就让其他的客户端不工作了…..那会感觉多线程是我学的最麻烦的地方….那时用了一个下午搞了个多线程的socket程序乐呵呵的玩了好久~~ 要说我最讨厌Py

(IOCP)-C#高性能Socket服务器的实现

C#高性能Socket服务器的实现(IOCP) https://www.jianshu.com/p/c65c0eb59f22 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux中有poll和epoll来实现,在windows下面 微软MSDN中也提供了SocketAsyncEventArgs这个类来实现IOCP 地址:https://msdn.m

如何用PHP实现Socket服务器

想要构建聊天应用,或者甚至是游戏吗?那么,socket服务器将成为你迈出的第一步.一旦你了解了创建服务器的基本功能,那么后续的优化步骤就会变得同样简单. socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接.一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息. 不要走开,下面是完整的源代码: // Set time limit to indefinite execution set_time_limit (0); // Set the ip and