#include "my_socket.h" int listenfd_init(char* ip, char* port) { int fd_server ; struct sockaddr_in server_addr ; int reuse = 1 ; if((fd_server = socket(AF_INET,SOCK_STREAM, 0) ) == -1) { perror("socket"); exit(-1); } if(0 != setsockopt(fd_server,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int))) { perror("setsockopt"); close(fd_server); exit(-1); } memset(&server_addr, 0 , sizeof(server_addr)) ; server_addr.sin_family = AF_INET ; server_addr.sin_port = htons(atoi(port)); server_addr.sin_addr.s_addr = inet_addr(ip); if(-1 == bind(fd_server,(struct sockaddr*)&server_addr,sizeof(server_addr))) { perror("bind"); close(fd_server); exit(-1); } if(-1 == listen(fd_server,5)) { perror("listen"); close(fd_server); exit(-1); } return fd_server ; } void handle_request(int fd_client) { int fd_file ; int read_n ; MSG msg,snd_msg ; memset(&msg,0, sizeof(msg)); recv(fd_client,&msg, MSG_LEN , 0) ; recv(fd_client,&msg.s_buf,msg.s_len,0) ; printf("recv msg :%s \n", msg.s_buf); fd_file = open(msg.s_buf,O_RDONLY); while(memset(&snd_msg,0,sizeof(msg)), (read_n = read(fd_file,snd_msg.s_buf,MSG_SIZE)) >0) { snd_msg.s_len = read_n ; send(fd_client, &snd_msg, snd_msg.s_len + MSG_LEN ,0); } snd_msg.s_len = 0 ; send(fd_client, &snd_msg, snd_msg.s_len + MSG_LEN ,0); close(fd_file); close(fd_client); }
#include "mysocket.h" int main(int argc,char *argv[])//ip port { if(argc!=3) { printf("too few argument!\n"); exit(-1); } int fd_sever,fd_client,fd_file; int reuse=1;//使IP可以重用 struct sockaddr_in sever_addr,client_addr; int addrlen=sizeof(client_addr); int read_n; // char file_name[128]=""; MSG msg,snd_msg;//8K if((fd_sever=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("open"); exit(-1); } if(0!=setsockopt(fd_sever,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int))) { perror("setopt"); close(fd_sever); exit(-1); } memset(&sever_addr,0,sizeof(sever_addr)); sever_addr.sin_family=AF_INET;//ipv4 sever_addr.sin_port=htons(atoi(argv[2])); sever_addr.sin_addr.s_addr=inet_addr(argv[1]); //绑定 if(-1==bind(fd_sever,(struct sockaddr*)&sever_addr,sizeof(sever_addr))) { perror("bind"); close(fd_sever); exit(-1); } printf("bind success!\n"); if(-1==listen(fd_sever,0)) { perror("listen"); close(fd_sever); exit(-1); } printf("listen success\n"); while(fd_client=accept(fd_sever,(struct sockaddr *)&client_addr,&addrlen))//不想接受信息可以不填写结构体 NULL { printf("client connect:%s:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));//网络端口和IP转为主机模式 // memset(file_name,0,128); memset(&msg,0,sizeof(msg)); //msg用于保存文件名极其大小 recv(fd_client,&msg.s_len,MSG_LEN,0);//先收长度,再收文件名 recv(fd_client,&msg.s_buf,msg.s_len,0); printf("recvmsg:%s\n",msg.s_buf); fd_file=open(msg.s_buf,O_RDONLY);//snd_msg while(memset(&snd_msg,0,sizeof(snd_msg)),(read_n=rea
网络编程TCP总结及实践-C语言(四)
#include
#include
#include
#include
#include
#include
#define MSG_SIZE 8188 #define MSG_LEN (8192 - MSG_SIZE) typedef struct tag { int s_len ; char s_buf[MSG_SIZE]; } MSG; int listenfd_init(char* ip, char* port); void handle_request(int fd_client); #endif