聊天室:
1.编写服务端收发客户端的信息(聊天室人数限制有server端连接数决定)。
2.编写客户端记录登录用户名,发送本用户信息,接收其他用户信息。
主要函数:socket,pthread
代码示例:
server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
int accid[5] = {0};
int i = 0;
void func(void *acid)
{
char buf[255] = {'\0'};
while(1)
{
int j,m;
memset(buf,'\0',255);
read(*((int *)acid),buf,255);
for(j = 0;j < 5;j++)
{
;
if(accid[j] != *((int *)acid) && accid[j] != 0)
{
write(accid[j],buf,255);
}
}
}
}
void *acc_buf(void *sockid)
{
while(1)
{
accid[i] = accept(*((int *)sockid),NULL,NULL);
pthread_t tid;
pthread_create(&tid,NULL,(void *)func,(void *)&accid[i]);
i++;
}
pthread_exit(NULL);
}
void result()
{
int sockid;
pthread_t acc;
sockid = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in s_addr;
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(8000);
inet_aton("192.168.200.199",&s_addr.sin_addr);
bind(sockid,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
listen(sockid,5);
pthread_create(&acc,NULL,acc_buf,(void *)&sockid);
pthread_join(acc,NULL);
}
int main()
{
result();
return 0;
}
client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
char name[20] = {'\0'};
void *send_buf(void *sockid)
{
char buf[255] = {'\0'};
char send_buf[300] = {'\0'};
while(1)
{
memset(buf,'\0',255);
memset(send_buf,'\0',300);
fgets(buf,255,stdin);
sprintf(send_buf,"%s >>> %s",name,buf);
write(*((int *)sockid),send_buf,300);
}
pthread_exit(NULL);
}
void *get_buf(void *sockid)
{
char read_buf[300] = {'\0'};
while(1)
{
memset(read_buf,'\0',300);
read(*((int *)sockid),read_buf,300);
printf("%s",read_buf);
}
pthread_exit(NULL);
}
void result()
{
int sockid;
pthread_t send;
pthread_t get;
sockid = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in c_addr;
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(8000);
inet_aton("192.168.200.199",&c_addr.sin_addr);
connect(sockid,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in));
sleep(3);
pthread_create(&send,NULL,send_buf,(void *)&sockid);
pthread_create(&get,NULL,get_buf,(void *)&sockid);
pthread_join(send,NULL);
pthread_join(get,NULL);
}
int main()
{
printf("input your name : ");
scanf("%s",name);
result();
return 0;
}
结果示例:
bwn在abc与hjk聊天过程中加入
简易ftp:
1.编写服务端
2.编写客户端连接服务端执行命令
3.支持命令
cd:打开服务器文件夹
ls:查看服务器文件夹内容
mycd:打开客户端文件夹
myls:查看客户端文件内容
put:上传客户端文件到服务端
get:下载服务端文件到客户端
主要应用函数:socket,strtok,opendir,chdir,readdir,getcwd
代码示例:
server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#pragma pack(1)
struct sockaddr_in s_addr;
struct sockaddr_in a_addr;
void del_blank(char *n,char c)
{
int i=0,j=0;
while(n[i])
{
if(n[i]==c) i++;
else n[j++]=n[i++];
}
n[j]='\0';
}
void deli_com(char str[],char command[],char argv[])
{
if(strlen(str) != 0)
{
char* p = strtok(str, " ");
sprintf(command,"%s",p);
p = strtok(NULL," ");
if(p != NULL)
{
sprintf(argv,"%s",p);
}
}
}
void scd(int a_id,char path[],char argv[])
{
memset(path,0,50);
sprintf(path,"%s",argv);
del_blank(path,' ');
del_blank(path,'\n');
write(a_id,path,50);
}
void sls(char dir_name[],char context[],int a_id)
{
DIR * dir;
struct dirent * ptr;
dir = opendir(dir_name);
if(dir == NULL)
{
perror("why");
exit(-1);
}
while((ptr = readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
{
continue;
}
strcat(context,ptr->d_name);
strcat(context,"\n");
}
write(a_id,context,255);
memset(context,0,255);
closedir(dir);
}
void spwd(char dir_name[],int a_id)
{
char get_path[50];
chdir(dir_name);
getcwd(get_path,50);
write(a_id,get_path,50);
}
void sget(char path[],char argv[],int a_id,char *scontext)
{
char r_path[50] = {0};
int fd;
int size;
sprintf(r_path,"%s/%s",path,argv);
del_blank(r_path,' ');
del_blank(r_path,'\n');
fd = open(r_path,O_RDWR);
if(fd == -1)
{
printf("open file fail\n");
perror("why");
exit(-1);
}
size = lseek(fd,0,SEEK_END);
scontext = (char *)malloc(size);
lseek(fd,0,SEEK_SET);
read(fd,scontext,size);
close(fd);
write(a_id,scontext,size);
memset(scontext,0,size);
free(scontext);
}
void sput(char path[],char argv[],int a_id,char *pcontext)
{
int fd;
char f_path[50] = {0};
pcontext = (char *)malloc(1024);
memset(pcontext,0,1024);
read(a_id,pcontext,1024);
sprintf(f_path,"%s/%s",path,argv);
del_blank(f_path,' ');
del_blank(f_path,'\n');
fd = open(f_path,O_CREAT|O_RDWR,0777);
lseek(fd,0,SEEK_SET);
write(fd,pcontext,1024);
close(fd);
free(pcontext);
}
void init_command(char command[],char argv[],char path[],int a_id,char *scontext,char *pcontext,char context[])
{
if(strcmp(command,"cd") == 0)
{
scd(a_id,path,argv);
}
else if(strcmp(command,"ls") == 10)
{
sls(path,context,a_id);
}
else if(strcmp(command,"pwd") == 10)
{
spwd(path,a_id);
}
else
{
if(strcmp(command,"get") == 0)
{
if(strlen(argv) != 0)
{
sget(path,argv,a_id,scontext);
}
}
else
{
sput(path,argv,a_id,pcontext);
}
}
memset(argv,0,50);
memset(command,0,10);
}
void result(char s_ip[],char s_port[])
{
int s_id;
int a_id;
int len;
char *scontext = NULL;
char *pcontext = NULL;
char context[255]= {'\0'};
char command[10] = {0};
char argv[50] = {0};
char r_buf[255] = {0};
char path[50] = {0};
s_id = socket(AF_INET,SOCK_STREAM,0);
if(s_id == -1)
{
perror("why");
exit(-1);
}
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(*s_port);
inet_aton(s_ip,&s_addr.sin_addr);
bind(s_id,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
listen(s_id,5);
len = sizeof(struct sockaddr);
a_id = accept(s_id,(struct sockaddr *)&a_addr,&len);
getcwd(path,50);
while(1)
{
read(a_id,r_buf,255);
deli_com(r_buf,command,argv);
init_command(command,argv,path,a_id,scontext,pcontext,context);
}
}
int main(int argc,char **argv)
{
if(argc != 3)
{
perror("why");
exit(-1);
}
result(argv[1],argv[2]);
return 0;
}
client
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
struct sockaddr_in s_addr;
void deli_com(char buf[],char command[],char argv[])
{
char* p = strtok(buf, " ");
sprintf(command,"%s",p);
p = strtok(NULL," ");
if(p != NULL)
{
sprintf(argv,"%s",p);
}
memset(buf,0,255);
}
void del_blank(char *p,char c)
{
int i=0,j=0;
while(p[i])
{
if(p[i]==c) i++;
else p[j++]=p[i++];
}
p[j]='\0';
}
void myls(char dir_name[])
{
DIR * dir;
struct dirent * ptr = NULL;
dir = opendir(dir_name);
if(dir == NULL)
{
perror("why");
exit(-1);
}
while((ptr = readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
{
continue;
}
printf("%s\n", ptr->d_name);
}
closedir(dir);
}
void mypwd(char dir_name[])
{
char get_path[50] = {0};
chdir(dir_name);
getcwd(get_path,50);
printf("%s\n",get_path);
memset(get_path,0,50);
}
void sput(char path[],char argv[],char write_buf[],int s_id,char *pcontext)
{
char r_path[50] = {0};
int fd;
int size;
memset(r_path,0,50);
sprintf(r_path,"%s/%s",path,argv);
del_blank(r_path,' ');
del_blank(r_path,'\n');
write(s_id,write_buf,255);
fd = open(r_path,O_RDWR);
if(fd == -1)
{
printf("file open fail");
perror("why");
exit(-1);
}
size = lseek(fd,0,SEEK_END);
pcontext = (char *)malloc(size);
lseek(fd,0,SEEK_SET);
read(fd,pcontext,size);
write(s_id,pcontext,size);
close(fd);
free(pcontext);
}
void sget(char path[],char argv[],char write_buf[],int s_id,char *scontext,char *rcontext)
{
int fd;
umask(0);
char f_path[50] = {0};
scontext = (char *)malloc(1024);
write(s_id,write_buf,1024);
read(s_id,scontext,1024);
rcontext = (char *)malloc(strlen(scontext));
strncpy(rcontext,scontext,strlen(scontext));
sprintf(f_path,"%s/%s",path,argv);
del_blank(f_path,' ');
del_blank(f_path,'\n');
fd = open(f_path,O_CREAT|O_RDWR,0777);
if(fd == -1)
{
printf("create file fail\n");
perror("why");
exit(-1);
}
write(fd,rcontext,10);
close(fd);
memset(scontext,0,1024);
free(rcontext);
memset(rcontext,0,strlen(scontext));
free(scontext);
}
void init_command(char command[],char path[],char argv[],char write_buf[],int s_id,char *scontext,char *pcontext,char context[],char rcontext[])
{
if(command[0] == 'm' && command[1] == 'y')
{
if(strcmp(command,"mycd") == 0)
{
memset(path,0,50);
sprintf(path,"%s",argv);
del_blank(path,' ');
del_blank(path,'\n');
}
else if(strcmp(command,"myls") == 10)
{
myls(path);
}
else
{
mypwd(path);
}
}
else
{
if(strcmp(command,"get") == 0)
{
sget(path,argv,write_buf,s_id,scontext,rcontext);
}
else if(strcmp(command,"put") == 0)
{
sput(path,argv,write_buf,s_id,pcontext);
}
else
{
write(s_id,write_buf,255);
read(s_id,context,255);
printf("%s\n",context);
}
memset(argv,0,50);
memset(command,0,50);
memset(write_buf,0,255);
memset(context,0,255);
}
}
void result(char s_ip[],char s_port[])
{
int s_id;
char buf[255] = {0};
char bak[255] = {0};
char *scontext = NULL;
char *pcontext = NULL;
char *rcontext = NULL;
char context[255] = {0};
char command[10] = {'\0'};
char argv[50] = {0};
char path[50] = {0};
s_id = socket(AF_INET,SOCK_STREAM,0);
if(s_id == -1)
{
perror("why");
exit(-1);
}
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(*s_port);
inet_aton(s_ip,&s_addr.sin_addr);
connect(s_id,(struct sockaddr *)&s_addr,sizeof(struct sockaddr));
getcwd(path,50);
while(1)
{
printf(">>>>");
fgets(buf,255,stdin);
sprintf(bak,"%s",buf);
deli_com(buf,command,argv);
printf("--------------------------------------------------------------\n");
init_command(command,path,argv,bak,s_id,scontext,pcontext,context,rcontext);
printf("--------------------------------------------------------------\n");
}
}
int main(int argc,char **argv)
{
if(argc != 3)
{
perror("why");
exit(-1);
}
result(argv[1],argv[2]);
return 0;
}
结果示例:
服务端
客户端
文件传输结果