linux socket视频聊天,linux socket实现简单网络聊天

利用linux socket实现异步聊天有2种方式:

第一,利用多进程编程fork()函数实现

第二,利用select()函数实现

本文采用多进程方式实现,利用select()函数实现的聊天还存在一些问题,以后调试好了再上传。。。。

本程序只实现了一些简单点对点聊天功能,

服务器:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include int sockfd,new_fd;

static void sig_exit(int signumber)

{

close(new_fd);

close(sockfd);

}

main()

{

struct sockaddr_in my_addr,their_addr;

int ret;

int flags;

char buffer[100];

char recvbuf[100];

int maxfd;

struct timeval tv;

pid_t pid;

fd_set rfds;

tv.tv_sec=5;

tv.tv_usec=0;

sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd<0)

{

printf("socket error");

exit(0);

}

my_addr.sin_family=AF_INET;

my_addr.sin_port=htons(9999);

my_addr.sin_addr.s_addr=htonl(INADDR_ANY);

bzero(&(my_addr.sin_zero),8);

ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));

if(ret<0)

{

printf("bind error");

exit(0);

}

ret=listen(sockfd,10);

if(ret<0)

{

printf("listen error");

exit(0);

}

signal(SIGTTIN,SIG_IGN);

while(1)

{

int sin_size=sizeof(struct sockaddr_in);

new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size);

if(new_fd<0)

{

printf("accept error");

exit(0);

}

printf("server:got connect from %s\n",inet_ntoa(their_addr.sin_addr));

if((pid=fork())==-1)

{

printf("fork error");

exit(0);

}

else if(pid==0)

{

while(1)

{

printf("input send data:");

bzero(buffer,101);

if(fgets(buffer,100,stdin)==NULL)

{

exit(0);

}

if(!strncasecmp(buffer,"quit",4))

{

send(new_fd,buffer,strlen(buffer),0);

printf("quit\n");

close(new_fd);

close(sockfd);

exit(0);

}

if(send(new_fd,buffer,strlen(buffer),0)==-1)

{

printf("send error");

break;

}

}

}

else

{

signal(SIGCHLD,sig_exit);

while(1)

{

if((ret=read(new_fd,recvbuf,100))==-1)

{

exit(0);

}

recvbuf[ret]='\0';

if(!strncasecmp(recvbuf,"quit",4))

{

close(new_fd);

close(sockfd);

exit(0);

}

printf("\nyou have message:%s",recvbuf);

}

}

break;

}

}

客户端:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include int sockfd;

static void sig_exit(int signumber)

{

close(sockfd);

}

int main()

{

int numbytes;

int ret;

char buffer[100];

char recvbuf[100];

fd_set rfds;

pid_t pid;

struct hostent *he;

int maxfd;

struct sockaddr_in their_addr;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

printf("socket error");

exit(0);

}

their_addr.sin_family=AF_INET;

their_addr.sin_port=htons(9999);

their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

bzero(&(their_addr.sin_zero),8);

if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)

{

printf("connect error");

exit(0);

}

signal(SIGTTIN,SIG_IGN);

while(1)

{

if((pid=fork())==-1)

{

printf("fork error");

exit(0);

}

else if(pid==0)

{

while(1)

{

printf("input send data:");

if(fgets(buffer,100,stdin)==NULL)

{

exit(0);

}

if(!strncasecmp(buffer,"quit",4))

{

send(sockfd,buffer,strlen(buffer),0);

printf("quit\n");

close(sockfd);

exit(0);

}

if(send(sockfd,buffer,100,0)==-1)

{

printf("send error");

exit(0);

}

}

}

else

{

signal(SIGCHLD,sig_exit);

while(1)

{

if((ret=read(sockfd,recvbuf,100))==-1)

{

printf("recv error");

exit(0);

}

if(!strncasecmp(recvbuf,"quit",4))

{

close(sockfd);

exit(0);

}

recvbuf[ret]='\0';

printf("\nyou have message:%s",recvbuf);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值