(unix网络编程)即时通讯工具一:基本实现
来源:互联网 发布:淘宝一直显示等待揽收 编辑:程序博客网 时间:2024/06/08 06:28
学习网络编程,得有点东西交出来才行,所以贴一份自己写的通讯工具代码,仅仅是最基本的实现,大神勿喷。
服务器段代码如下:
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <errno.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/select.h>#define MAXLINE 4096#define SERV_PORT 5000#define LISTENQ 5int main(int argc, char **argv){int listenfd, connfd, maxfd;struct sockaddr_in cliaddr, servaddr;socklen_t clilen;char recvline[MAXLINE], sendline[MAXLINE];ssize_t nread;const char *quit_code = "quit\n";fd_set rset;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket");return -1;}memset(&servaddr, 0x00, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {perror("bind");return -1;}if (listen(listenfd, LISTENQ) < 0) {perror("listen");return -1;}clilen = sizeof(cliaddr);if ((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) < 0) {perror("accept");}maxfd = connfd > fileno(stdin) ? connfd + 1 : fileno(stdin) + 1; for(;;) {FD_ZERO(&rset);FD_SET(fileno(stdin), &rset);FD_SET(connfd, &rset);if (select(maxfd, &rset, NULL, NULL, NULL) < 0) {perror("select");continue;}if (FD_ISSET(connfd, &rset)) {memset(recvline, 0x00, MAXLINE);nread = read(connfd, recvline, MAXLINE);if (nread <= 0) {perror("read from connfd");continue;} else {if (strcasecmp(recvline, quit_code) == 0) {printf("client input quit, server will exit\n");break;} else {if (write(fileno(stdout), recvline, nread) < 0) {perror("write to stdout");continue;}}}}if (FD_ISSET(fileno(stdin), &rset)) {memset(sendline, 0x00, MAXLINE);nread = read(fileno(stdin), sendline, MAXLINE);if (nread < 0) {perror("read from stdin");continue;} else if (nread == 0) {printf("read EOF, server will exit\n");break;} else {if (strcasecmp(sendline, quit_code) == 0) {printf("server input quit code, server will exit\n");break;} else {if (write(connfd, sendline, nread) < 0) {perror("write to connfd");continue;}}}}}write(connfd, quit_code, strlen(quit_code) + 1);return 0;}
客户端代码如下:
#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <errno.h>#include <unistd.h>#define MAXLINE 4096#define SERV_PORT 5000int main(int argc, char **argv){int sockfd, maxfd;struct sockaddr_in servaddr;ssize_t nread;char recvline[MAXLINE], sendline[MAXLINE];const char *quit_code = "quit\n";fd_set rset;if (argc != 2) {printf("imcli1 <IPaddress>\n");return -1;}if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket");return -1;}memset(&servaddr, 0x00, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) < 0) {perror("inet_pton");return -1;}if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {perror("connect");return -1;}maxfd = sockfd > fileno(stdin) ? sockfd + 1 : fileno(stdin) + 1;for (;;) {FD_ZERO(&rset);FD_SET(fileno(stdin), &rset);FD_SET(sockfd, &rset);if (select(maxfd, &rset, NULL, NULL, NULL) < 0) {perror("select");continue;}if (FD_ISSET(fileno(stdin), &rset)) {memset(sendline, 0x00, MAXLINE);nread = read(fileno(stdin), sendline, MAXLINE);if (nread < 0) {perror("read from stdin");continue;} else if (nread == 0) {printf("read EOF, client will exit\n");break;} else {if (strcasecmp(sendline, quit_code) == 0) {printf("client input quit code, client will exit\n");break;} else {if (write(sockfd, sendline, nread) <= 0) {perror("write to sockfd");continue;}}}}if (FD_ISSET(sockfd, &rset)) {memset(recvline, 0x00, MAXLINE);nread = read(sockfd, recvline, MAXLINE);if (nread <= 0) {perror("read from sockfd");continue;} else {if (strcasecmp(recvline, quit_code) == 0) {printf("server input quit code, client will exit\n");break;} else {if (write(fileno(stdout), recvline, nread) <= 0) {perror("write to stdout");continue;}}}}}write(sockfd, quit_code, strlen(quit_code) + 1);return 0;}
总共差不多200行的代码量,其实不难,大家可以自己动手试试。
0 0
- (unix网络编程)即时通讯工具一:基本实现
- (unix网络编程)即时通讯工具二:服务端与客户端融合
- (unix网络编程)tcp回射程序一:基本实现
- Unix网络编程(一)基本字段和常用函数
- UNIX网络编程(一)
- unix网络编程基本编程
- Unix网络编程 之 基本套接字调用(一)
- UNIX网络编程卷一:调试工具 tcpdump lsof 总结
- unix网络编程(笔记一)
- UNIX网络编程--简介(一)
- unix网络编程笔记(一)
- unix网络编程笔记(一)
- Unix网络编程读书笔记(一)
- Unix网络编程之广播(一)
- UNIX网络编程笔记(一)
- Unix网络编程基本函数
- UNIX网络编程---基本TCP套接字编程(四)
- Unix 网络编程--一实现聊天和传文件
- 手势识别器UIGestureRecognizer实现手机的各种手势操作功能
- Linux 下磁盘分区偏移对于磁盘性能的影响
- 页面置换算法LRU
- 港版iPhone 5s升级移动4G完全体验:速度超快
- python的super用法遇到的问题
- (unix网络编程)即时通讯工具一:基本实现
- Object-C 学习笔记(二十七)--- 文件操作(沙盒)
- 北京日报:高招制度核心是要体现公平公正
- 保存CString字符串到文件
- 静态工厂方法
- 科学家细说银河系中央黑洞爆发的秘密
- Codeforces Round #220 (Div. 2)
- Oracle 为数据表解锁
- 质疑其合法身份,苹果全面下架比特币应用