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