基于Linux Socket的聊天室 编写
2016-05-26 09:11
671 查看
题目:聊天室
实现功能:1.用户注册
2.密码登录
3.单对单聊天
实现方式:socket fork实现
5.31:1 实现多进程发送接收
用户注册登录待实现。
服务器端
server.c
/*
*
Time:
programmer:
version:
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
#define WELCOME "Welcome to Chat Room"
int main(void)
{
struct sockaddr_in servaddr, cliaddr ;
socklen_t cliaddr_len ;
int listenfd,connfd ;
char buf[MAXLINE] ;
char str[INET_ADDRSTRLEN] ;
int i ,n ;
int npid ;
struct user {
char name[20];
char gender[10];
int age;
int IDnum;
char msg[MAXLINE];
} ;
//user inforamtion
listenfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr)) ;
servaddr.sin_family = AF_INET ;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT) ;
bind(listenfd, (struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listenfd,20) ;
printf("Accepting connections ..\n");
while(1){
cliaddr_len = sizeof(cliaddr) ;
if( (connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len)) < 0){
printf("accept error !\n");
}
npid = fork();
if(npid < 0){
printf("call to fork error! \n");
}
else if(npid == 0){
close(listenfd);
while(1){
n = read(connfd,buf,MAXLINE);
if(n == 0){
printf("the other side has been closed !");
break ;
}
printf("received from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port));
//send to client message for regsiter information inclde name
write(connfd,WELCOME,sizeof(WELCOME));
//write(STDOUT_FILENO, buf, sizeof(buf));
printf("%s",buf);
write(connfd,buf,n) ;
}
}
else
close(connfd) ;
}
}
/*
printf("the read number is %d\n",n);
while(1){
n=read(connfd,buf,MAXLINE);
if(n == 0){
printf("the other side has been closed \n");
break ;
}
for(i = 0; i <n ;i++)
buf[i] = toupper(buf[i]);
write(connfd,buf,n) ;
write(STDOUT_FILENO,buf,n);
}
close(connfd);//处理一次就关闭了连接
*/
//客户端代码
client.c
/* client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr ;
char buf[MAXLINE] ;
int sockfd,n ;
//char *str ;
/*
if(argc != 2){
fputs("usage;./client message \n",stderr);
exit(1);
}
*/
//str = argv[1] ;
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET ;
inet_pton(AF_INET,"127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
if( (connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) ) < 0)
printf("Connection abnormals!\n");
while(fgets(buf, MAXLINE, stdin) != NULL){
write(sockfd,buf,strlen(buf));
n = read(sockfd,buf, MAXLINE);
if(n == 0){
printf("the other side have been closed");
}
else{
write(STDOUT_FILENO, buf, n);
}
}
close(sockfd);
//write(sockfd,str,strlen(str));
//n = read(sockfd,buf,MAXLINE);
//printf("Response from server : %s\n",buf);
//write(STDOUT_FILENO, buf, n);
//??
//close(sockfd);
return 0 ;
}
实现功能:1.用户注册
2.密码登录
3.单对单聊天
实现方式:socket fork实现
5.31:1 实现多进程发送接收
用户注册登录待实现。
服务器端
server.c
/*
*
Time:
programmer:
version:
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
#define WELCOME "Welcome to Chat Room"
int main(void)
{
struct sockaddr_in servaddr, cliaddr ;
socklen_t cliaddr_len ;
int listenfd,connfd ;
char buf[MAXLINE] ;
char str[INET_ADDRSTRLEN] ;
int i ,n ;
int npid ;
struct user {
char name[20];
char gender[10];
int age;
int IDnum;
char msg[MAXLINE];
} ;
//user inforamtion
listenfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr)) ;
servaddr.sin_family = AF_INET ;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT) ;
bind(listenfd, (struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listenfd,20) ;
printf("Accepting connections ..\n");
while(1){
cliaddr_len = sizeof(cliaddr) ;
if( (connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len)) < 0){
printf("accept error !\n");
}
npid = fork();
if(npid < 0){
printf("call to fork error! \n");
}
else if(npid == 0){
close(listenfd);
while(1){
n = read(connfd,buf,MAXLINE);
if(n == 0){
printf("the other side has been closed !");
break ;
}
printf("received from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port));
//send to client message for regsiter information inclde name
write(connfd,WELCOME,sizeof(WELCOME));
//write(STDOUT_FILENO, buf, sizeof(buf));
printf("%s",buf);
write(connfd,buf,n) ;
}
}
else
close(connfd) ;
}
}
/*
printf("the read number is %d\n",n);
while(1){
n=read(connfd,buf,MAXLINE);
if(n == 0){
printf("the other side has been closed \n");
break ;
}
for(i = 0; i <n ;i++)
buf[i] = toupper(buf[i]);
write(connfd,buf,n) ;
write(STDOUT_FILENO,buf,n);
}
close(connfd);//处理一次就关闭了连接
*/
//客户端代码
client.c
/* client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr ;
char buf[MAXLINE] ;
int sockfd,n ;
//char *str ;
/*
if(argc != 2){
fputs("usage;./client message \n",stderr);
exit(1);
}
*/
//str = argv[1] ;
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET ;
inet_pton(AF_INET,"127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
if( (connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) ) < 0)
printf("Connection abnormals!\n");
while(fgets(buf, MAXLINE, stdin) != NULL){
write(sockfd,buf,strlen(buf));
n = read(sockfd,buf, MAXLINE);
if(n == 0){
printf("the other side have been closed");
}
else{
write(STDOUT_FILENO, buf, n);
}
}
close(sockfd);
//write(sockfd,str,strlen(str));
//n = read(sockfd,buf,MAXLINE);
//printf("Response from server : %s\n",buf);
//write(STDOUT_FILENO, buf, n);
//??
//close(sockfd);
return 0 ;
}
相关文章推荐
- 基于FS4412嵌入式系统移植(8) linux内核调试之printk
- linuxcon-europe 2015 linux大会
- 给Windows右键菜单添加类似Linux的"tail -f"命令
- LINUX 内核月报 taobao
- Linux 的启动流程-阮一峰
- linux rm cp mv 命令实例
- Linux 汇编语言开发指南
- linux sort 命令详解
- Linux Java的环境变量搭建
- Linux的inode的理解
- Linux通过netstat命令查看80端口连接数的方法
- 每天一个Linux命令(28)df命令
- linux磁盘分区2
- Centos中搭建python3开发环境
- VMware中linux访问共享文件夹设置流程
- CentOS安装 /BOOT分盘挂载无法修改大小解决方法
- Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一
- ctags的简单配置及其使用
- [Linux] Nutch 2.3.1+ Hbase + Hadoop + Solr 单机指南(四)
- linux下搜索文件方式一