赞
踩
运用socket网络编程方法,实现简单tcp服务器和客户端交互。
客户端实现:
/*=============================================== client.c ================================================*/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctype.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> int main(int argc, char *argv[]) { if(argc != 3) { printf("Usage:%s IP Port\n",argv[0]); exit(-1); } //创建套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("socket"); exit(-1); } //服务器的IP地址和端口号 struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(atoi(argv[2])); //seraddr.sin_addr.s_addr = inet_addr(INADDR_ANY); //seraddr.sin_addr.s_addr = htonl(INADDR_ANY); seraddr.sin_addr.s_addr = inet_addr(argv[1]); socklen_t seraddr_len; //请求连接服务器 if(connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)) == -1) { perror("connect"); exit(-1); } //收发数据 char buf[64] = {0}; char file[64] = {0}; int n, fd1; char *p; while(1) { memset(buf, 0, sizeof(buf)); //发送数据 fgets(buf, 64, stdin); buf[strlen(buf)-1] = '\0'; int m = write(sockfd, buf, 64); if(m < 0) { perror("writ"); exit(-1); } //以空格分隔命令和参数 p = buf; while(p[0] != ' ') p++; p[0] = '\0'; strcpy(file, p+1); if(strcmp(buf, "time") == 0) { //准备接收时间 memset(buf, 0, sizeof(buf)); if(read(sockfd, buf, 64) < 0) { perror("read"); exit(-1); } printf("Ram:\n\ttime:%s", buf); } else if(strcmp(buf, "get") == 0) { //准备接收文件 memset(buf, 0, sizeof(buf)); fd1 = open(file, O_WRONLY|O_CREAT|O_TRUNC,0664); if(fd1 == -1) { perror("open"); exit(-1); } while((n = recv(sockfd, buf, 64, 0)) > 0) { printf("recv %d bytes\n",n); write(fd1, buf, n); memset(buf, 0, sizeof(buf)); if( n < 64) break; } printf("%s receive finished...\n",file); close(fd1); } else { //准备接收计算的大小 memset(buf, 0, sizeof(buf)); if(read(sockfd, buf, 64) < 0) { perror("read"); exit(-1); } printf("Ram\n\tsize:%s\n", buf); } } close(sockfd); return 0; }
服务器实现:
/*=============================================== serve.c ================================================*/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctype.h> #include <time.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> int main(int argc, char *argv[]) { if(argc != 3) { printf("Usage:%s IP Port\n",argv[0]); exit(-1); } //创建套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("socket"); exit(-1); } //端口复用函数:解决端口号被系统占用的情况 int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //绑定服务器的IP地址和端口号 struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(atoi(argv[2])); //seraddr.sin_addr.s_addr = inet_addr(INADDR_ANY); //seraddr.sin_addr.s_addr = htonl(INADDR_ANY); seraddr.sin_addr.s_addr = inet_addr(argv[1]); bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); //设置监听套接字 if(listen(sockfd, 10) == -1) { perror("listen"); exit(-1); } //等待客户端连接 struct sockaddr_in clientaddr = {0};//客户端地址信息 int len_client; //客户端地址大小 int connfd; connect: connfd = accept(sockfd, (struct sockaddr *)&clientaddr,&len_client); if(connfd == -1) { perror("accept"); exit(-1); } printf("connected...\n"); char buf[64] = {0}; int n, len, fd1; char file[64] = {0}; time_t now_time; char *p; //收发数据 while(1) { memset(buf, 0, sizeof(buf)); //接收数据 int m = read(connfd, buf, 64); if(m < 0) { perror("read"); exit(-1); } else if(m == 0)//客户端关闭 未读到数据 { printf("waiting connection...\n"); close(connfd); goto connect; //break; } printf("Rem:\n\t%s\n",buf); //以空格分隔命令和参数 p = buf; while(p[0] != ' ') p++; p[0] = '\0'; strcpy(file, p+1); if(strcmp(buf,"time") == 0) { //发送当前系统时间 memset(buf, 0, sizeof(buf)); now_time = time(NULL); strcpy(buf, ctime(&now_time)); if(write(connfd, buf, 64) < 0) { perror("write"); exit(-1); } } else if(strcmp(buf, "get") == 0) { //发送文件 memset(buf, 0, sizeof(buf)); fd1 = open(file, O_RDONLY); if(fd1 == -1) { perror("open"); exit(-1); } while((n = read(fd1, buf, 64)) > 0) { printf("read %d bytes\n",n); write(connfd, buf, n); memset(buf, 0, sizeof(buf)); } printf("%s send finished...\n",file); close(fd1); } else { //发送接收到的数据字节大小 len = strlen(buf); memset(buf, 0, sizeof(buf)); sprintf(buf, "%d", len); if(write(connfd, buf, 64) < 0) { perror("write"); exit(-1); } } } close(sockfd); close(connfd); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。