Socket——实现简单的一对一服务器端与客户端聊天功能
来源:互联网 发布:ubuntu虚拟机屏幕小 编辑:程序博客网 时间:2024/06/12 07:38
server.c
/* Socket head file */#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>/*sockaddr_in{} */#include<arpa/inet.h>/* Unix standard head file */#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include <errno.h>/*strerror(),perror(),errno head file*/#include <sys/time.h>#include <sys/wait.h> #define PORT 9999#define MAX_BUFF 1024#define LISTENQ 1024int main (int argc, char **argv){ int sockfd; int new_fd; socklen_t len; int retval; int maxfd = -1; unsigned int value = 1; fd_set rfds; struct sockaddr_in my_addr; struct sockaddr_in t_addr; struct timeval tv; int my_port; char buf[MAX_BUFF]; if(2 == argc) { my_port = atoi(argv[1]); } else { my_port = PORT; } /* Use Socket() function*/ if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) { perror("Socket error"); exit(1); } memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(my_port); my_addr.sin_addr.s_addr = INADDR_ANY; /*Use bind() function*/ setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(void *)&value,sizeof(value)); if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr))<0) { perror("bind error"); exit(1); } /* Use listen() function */ if(listen(sockfd,LISTENQ)<0) { perror("listen error"); exit(1); } /* Start to connect... */ while(1) { printf("waiting for new connecting to start new char:\n"); len = sizeof(struct sockaddr); if((new_fd = accept(sockfd,(struct sockaddr *)&t_addr,&len))<0) { perror("accept error"); exit(errno); } else { printf("server got connection from:%s,por t%d,socked %d\n",inet_ntoa(t_addr.sin_addr),ntohs(t_addr.sin_port),new_fd); } /* Start processing the data on new connection */ while(1) { /* Set empty */ FD_ZERO(&rfds); /* Add the standard input handle 0 */ FD_SET(0,&rfds); maxfd = 0; /*Add the current connection handle new_fd */ FD_SET(new_fd,&rfds); if(new_fd > maxfd) { maxfd = new_fd; } /* Set maximum waiting time */ tv.tv_sec = 1; tv.tv_usec = 0; retval = select(maxfd+1,&rfds,NULL,NULL,&tv); if(retval < 0) { printf("select error!%s\n",strerror(errno)); break; } else if(retval == 0) { continue; } else { if(FD_ISSET(new_fd,&rfds))/* Determine whether the state of the FD in the fdset collection is changing. */ { /* If there is message, accept and display */ memset(&buf,0,sizeof(buf)); /* Receive messages sent from the other, up to MAX_BUFF bytes */ len = recv(new_fd,buf,MAX_BUFF,0); if(len > 0) { printf("Receive message success: %s \n",buf); } else { if(len < 0) { printf("Receive message fail,error is %s.\n",errno,strerror(errno)); } else printf("quit\n"); break; } }//FD_ISSET = Socket if(FD_ISSET(0,&rfds)) { memset(&buf,0,sizeof(buf)); read(0,buf,MAX_BUFF); len = send(new_fd,buf,strlen(buf)-1,0); if(len < 0) { printf("error!\n"); break; } else { printf("messages success!\n %s",buf); } }//FD_ISSET = 0 } }//End of second while close(new_fd); }//End of frist while close(sockfd); return 0;} /* ----- End of main() ----- */
client.c
/* Socket head file */#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>/*sockaddr_in{}*/#include<arpa/inet.h>/* Unix standard head file */#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include <errno.h>/* strerror(),perror(),errno head file*/#include <sys/time.h>#include <sys/wait.h>#define MAXBUFF 1024 #define PORT 9999/******************************************************************************** * Description: * Input Args: * Output Args: * Return Value: ********************************************************************************/int main (int argc, char **argv){ int sockfd; int len; int retval; int maxfd = -1; fd_set rfds; struct sockaddr_in dest; struct timeval tv; char buff[MAXBUFF]; if(2 != argc) { printf("input error"); return -1; } /* Use Socket() function */ if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) { perror("Socket error"); exit(errno); } /*Initialize the address and port information of the server */ memset(&dest,0,sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(PORT); if(inet_pton(AF_INET,argv[1],&dest.sin_addr)<=0) { perror("inet_pton() to set IP address failure"); exit(1); } /* connect to server */ printf("Connect to server[%s:%d]\n",argv[1],PORT); if(connect(sockfd,(struct sockaddr *)&dest,sizeof(dest))<0) { perror("connect error"); exit(errno); } printf("\nReady to chatting...\n"); while(1) { /* Set empty */ FD_ZERO(&rfds); /* Add the standard input handle 0 */ FD_SET(0,&rfds); maxfd = 0; /* Add the current connection handle new_fd */ FD_SET(sockfd,&rfds); if(sockfd > maxfd) { maxfd = sockfd; } /* Set maximum waiting time */ tv.tv_sec = 1; tv.tv_usec = 0; /* Start to wait */ retval = select(maxfd + 1,&rfds,NULL,NULL,&tv); if(retval < 0) { printf("select error\n"); break; } else if(retval == 0) { continue; } else { if(FD_ISSET(sockfd,&rfds))/* Determine whether the state of the FD in the fdset collection is changing. */ { memset(&buff,0,sizeof(buff)); /* Receive messages sent from the other, up to MAX_BUFF bytes */ len = recv(sockfd,buff,MAXBUFF,0); if(len > 0) { printf("Receive messages success: %s \n",buff); } else { if(len < 0) { printf("Receive messages fail,error is:%s.\n",errno,strerror(errno)); } else printf("quit\n"); break; } }//FD_ISSET = sockfd if(FD_ISSET(0,&rfds)) { memset(&buff,0,sizeof(buff)); read(0,buff,MAXBUFF); len = send(sockfd,buff,strlen(buff)-1,0); if(len < 0) { printf("Send error\n"); break; } else { printf("Send messages success!\n %s...\n",buff); } }//FD_ISSET = 0 }//select finished }//End of while close(sockfd); return 0;} /* ----- End of main() ----- */
其中在client.c使用了select()函数。
测试结果:
0 0
- Socket——实现简单的一对一服务器端与客户端聊天功能
- 直播项目,在线聊天功能--socket实现客户端和服务器端通讯的简单案例
- 利用socket实现客户端与服务器端聊天
- java Socket简单聊天实现 —— 实现服务器端向客户端广播内容
- Android 使用Socket实现服务器与手机客户端的长连接一:一对一聊天
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- Linux网络编程(四)——多线程实现简单的聊天(linux 服务器端 windows客户端)
- java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
- Linux网络编程(五)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
- windows网络编程(八)——重叠I/O+多线程实现简单的聊天(windows服务器端 windows客户端)
- windows网络编程(九)——IOCP+多线程实现简单的聊天(windows服务器端 windows客户端)
- 简单迭代服务器端/客户端:模仿飞Q聊天功能,实现IM通信
- 多线程实现简单的一对一聊天
- 简单实现带界面的一对一聊天
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
- Socket网络编程—简单聊天软件--2、服务器端代码
- socket编程,实现简单的客户端服务器端发送数据
- Java Socket 客户端与服务器端的简单交互
- Some keyword
- Centos7.2系统下安装VirtualBox缺少compiler-gcc6.h
- 进程
- C语言格式输出函数printf()详解
- 大型网站架构之分布式消息队列
- Socket——实现简单的一对一服务器端与客户端聊天功能
- Qt编写OCX插件注册错误
- 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(四):缺省适配器,适配器模式总结
- GPUImage给视频添加水印
- JAVA使用继承正确性判断
- css3-animation动画
- Activity 全屏,沉浸式模式这一篇就够了
- python服务器端收发请求的实现代码
- 链表使用: 两个有序链表序列的合并