2.2.系统及网络编程——网络基础巩固及Socket网络编程(二)
咕了好几天了,应该要补一补了,这篇是对于socket编程的另一个实例,主要加入了文件信息的传递
文件的读写操作
文件流
打开:FILE *fopen(const char *pathname, const char *mode);
读:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
写:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
关闭:int fclose(FILE *stream);
文件描述符符
打开:int open(const char *pathname, int flags);
读:ssize_t read(int fd, void *buf, size_t count);
写:ssize_t wirte(int fd, const void *buf, size_t count);
关闭:int close(int fd);
代码范例
服务端
head.h中包含常用的C语言库以及自己写的一点函数,具体可见上期
#include "head.h"
int main(int argc, char **argv){
if(argc != 2){
fprintf(stderr, "Usage:%s port!\n", argv[0]);
exit(1);
}
int server_listen, sockfd, port;
port = atoi(argv[1]);
if((server_listen = socket_create(port)) < 0){
perror("socket_create()");
exit(1);
}
if((sockfd = accept(server_listen, NULL, NULL)) < 0){
perror("accept()");
exit(1);
}
FILE *fp;
if((fp = fopen("./tmp.txt", "w")) == NULL){
perror("fopen()");
exit(1);
}
long long i = 0;
long long len;
recv(sockfd, &len, sizeof(len), 0)
char buff[1024 + 5] = {0};
while(1){
memset(buff, 0, sizeof(buff));
int retval = recv(sockfd, buff, sizeof(buff), 0);
if (retval <= 0){
printf("Error!\n");
close(sockfd);
break;
}
int nwrite = fwrite(buff, 1, 1024, fp);
int i += strlen(buff);
if(i == len){
printf("Over\n");
close(sockfd);
break;
}
}
fclose(fp);
return 0;
}
客户端
客户端建立套接字并连接到服务端函数
int socket_connect(char *ip, int port){
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
return -1;
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip);
if(connect(sockfd, (struct sockaddr*)&server, sizeof(server)) < 0){
return -1;
}
return sockfd;
}
客户端代码
#include "head.h"
int main(int argc, char **argv){
if (argc != 4){
fprintf(stderr, "Usage : %s ip port file!\n", argv[0]);
exit(1);
}
int port, sockfd;
char ip[20] = {0};
char file[50] = {0};
FILE *fp;
strcpy(ip, argv[1]);
port = atoi(argv[2]);
strcpy(file, argv[3]);
if ((sockfd = socket_connect(ip, port)) < 0){
perror("socket_connect()");
exit(1);
}
if ((fp = fopen(file, "r")) == NULL){
perror("fopen()");
exit(1);
}
size_t size;
char buff[1024] = {0};
while((size = fread(buff, 1, 1024, fp))){
send(sockfd, buff, size, 0);
printf("%s\n", buff);
bzero(buff, sizeof(buff));
}
close(sockfd);
fclose(fp);
return 0;
}