day34练习:
1. 用udp实现文件传输,服务器给客户端发文件
client.c
#include "head.h"
int main(int argc, const char *argv[])
{
int clifd = socket(AF_INET,SOCK_DGRAM,0);
if (clifd < 0)
{
perror("socket fail");
return -1;
}
printf("Input filename");
char filename[1024];
fgets(filename,sizeof(filename),stdin);
filename[strlen(filename) - 1] = '\0';
struct sockaddr_in seraddr;
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sendto(clifd,filename,strlen(filename)+1,0,(const struct sockaddr*)&seraddr,sizeof(seraddr));
int fd_d = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);
if (fd_d < 0)
{
perror("open fail");
return -1;
}
while (1)
{
char buf[1024] = {0};
int ret = recvfrom(clifd,buf,sizeof(buf),0,NULL,NULL);
if (strncmp(buf,".quit",5) == 0)
break;
write(fd_d,buf,ret);
}
close(fd_d);
close(clifd);
return 0;
}
server.c
#include "head.h"
int main(int argc, const char *argv[])
{
int serfd = socket(AF_INET,SOCK_DGRAM,0);
if (serfd < 0)
{
perror("socket fail");
return -1;
}
struct sockaddr_in seraddr;
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(serfd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
{
perror("bind fail");
return -1;
}
char filename[1024];
struct sockaddr_in cliaddr;
bzero(&cliaddr,sizeof(cliaddr));
socklen_t len = sizeof(cliaddr);
recvfrom(serfd,filename,sizeof(filename),0,(struct sockaddr*)&cliaddr,&len);
printf("filename = %s\n",filename);
int fd_s = open(filename,O_RDONLY);
if (fd_s < 0)
{
perror("open fail");
return -1;
}
while (1)
{
char buf[1024] = {0};
int ret = read(fd_s,buf,sizeof(buf));
if (ret == 0)
{
sendto(serfd,".quit",5,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
break;
}
sendto(serfd,buf,ret,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
}
close(fd_s);
close(serfd);
return 0;
}
2. 用udp实现客户端和服务器点对点聊天
client.c
#include "../head.h"
int res_fd;
void do_handler (int signo)
{
printf("exit...\n");
close(res_fd);
exit(0);
}
int main(int argc, const char *argv[])
{
//1.socket
int fd = socket(AF_INET,SOCK_DGRAM,0);
if (fd < 0)
{
perror("socket fail");
return -1;
}
// Initialize server address once (optimization from server.c pattern)
struct sockaddr_in seraddr;
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// Send initial connection message to server
char buf[1024] = "Client connected";
sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&seraddr,sizeof(seraddr));
pid_t pid = fork();
if (pid < 0)
{
perror("fork fail");
return -1;
}
if (pid > 0)
{
res_fd = fd;
signal(SIGUSR1,do_handler);
while (1)
{
printf("> ");
fgets(buf,sizeof(buf),stdin);
sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&seraddr,sizeof(seraddr));
if (strncmp(buf,"quit",4) == 0)
{
kill(pid,SIGUSR1);
wait(NULL);
close(fd);
exit(0);
}
}
}else if (pid == 0)
{
res_fd = fd;
signal(SIGUSR1,do_handler);
while (1)
{
recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
printf("cli buf: %s\n",buf);
if (strncmp(buf,"quit",4) == 0)
{
kill(getppid(),SIGUSR1);
close(fd);
exit(0);
}
}
}
return 0;
}
server.c
#include "../head.h"
int res_fd;
void do_handler (int signo)
{
printf("exit...\n");
close(res_fd);
exit(0);
}
int main(int argc, const char *argv[])
{
//1.socket
int fd = socket(AF_INET,SOCK_DGRAM,0);
if (fd < 0)
{
perror("socket fail");
return -1;
}
//2bind
struct sockaddr_in seraddr;
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
{
perror("bind fail");
return -1;
}
char buf[1024];
//3.recvfrom
struct sockaddr_in cliaddr;
bzero(&cliaddr,sizeof(cliaddr));
socklen_t len = sizeof(cliaddr);
recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&cliaddr,&len);
printf("ser buf: %s\n",buf);
pid_t pid = fork();
if (pid < 0)
{
perror("fork fail");
return -1;
}
if (pid > 0)
{
res_fd = fd;
signal(SIGUSR1,do_handler);
while (1)
{
printf("> ");
fgets(buf,sizeof(buf),stdin);
sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
if (strncmp(buf,"quit",4) == 0)
{
kill(pid,SIGUSR1);
wait(NULL);
close(fd);
exit(0);
}
}
}else if (pid == 0)
{
res_fd = fd;
signal(SIGUSR1,do_handler);
while (1)
{
recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
printf("ser buf: %s\n",buf);
if (strncmp(buf,"quit",4) == 0)
{
kill(getppid(),SIGUSR1);
close(fd);
exit(0);
}
}
}
return 0;
}
925

被折叠的 条评论
为什么被折叠?



