Linux网络编程之简易的点对点聊天程序程序
来源:互联网 发布:萤火虫软件 编辑:程序博客网 时间:2024/04/28 06:13
本程序基于上一篇echo_server的实现,稍作修改,增加了发送消息,服务端客户端各自运行两个进程,一个进程负责发送消息,另一个进程负责接收消息。
代码如下:
- p2p_server.c
#include <sys/socket.h>#include <sys/types.h>#include <string.h>#include <unistd.h>#include <memory.h>#include <errno.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#define ERR_EXIT(m) \ do{ \ perror(m); \ exit(EXIT_FAILURE);\ }while(0)int main(int argc, char *argv[]){ int socket_fd; if((socket_fd=socket(PF_INET,SOCK_STREAM,0))==-1) { ERR_EXIT("socket"); } struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5678); servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); /* servaddr.sin_addr.s_addr=htonl(INADDR_ANY); inet_aton("127.0.0.1",&servaddr.sin_addr); */ int on=1; if(setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))==-1){ ERR_EXIT("setsockopt"); } if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1) ERR_EXIT("bind"); if(listen(socket_fd,SOMAXCONN)==-1) ERR_EXIT("listen"); struct sockaddr_in peeraddr; memset(&peeraddr,0,sizeof(peeraddr)); socklen_t len=sizeof(peeraddr); int conn; if((conn=accept(socket_fd,(struct sockaddr*)&peeraddr,&len))==-1) ERR_EXIT("accept"); printf("ip:%s\tport:%d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port)); pid_t pid; pid=fork(); if(pid<0){ ERR_EXIT("fork"); } else if(pid==0){ //child process receive message close(socket_fd); char recebuf[1024]={}; while(1){ memset(recebuf,0,sizeof(recebuf)); int rlen=read(conn,recebuf,sizeof(recebuf)); if(rlen==-1){ ERR_EXIT("receive"); } else if(rlen==0){ printf("close:\n"); close(conn); exit(EXIT_SUCCESS); } else{ fputs(recebuf,stdout); write(conn,recebuf,rlen); } } close(conn); }else{ //parent process send message char sendbuf[1024]={}; while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){ write(conn,sendbuf,sizeof(sendbuf)); fputs(sendbuf,stdout); memset(sendbuf,0,sizeof(sendbuf)); } close(conn); close(socket_fd); } return 0;}
- p2p_client.c
#include <sys/socket.h>#include <sys/types.h>#include <string.h>#include <unistd.h>#include <memory.h>#include <errno.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#define ERR_EXIT(m)\ do{\ perror(m);\ exit(EXIT_FAILURE);\} while(0)int main(int argc, char *argv[]){ if(argc<2){ ERR_EXIT("too little arguments"); } int socket_fd; if((socket_fd=socket(AF_INET,SOCK_STREAM,0))==-1){ ERR_EXIT("socket"); } struct sockaddr_in servaddr; servaddr.sin_family=AF_INET; servaddr.sin_port=htons(5678); servaddr.sin_addr.s_addr=inet_addr(argv[1]); if(connect(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1){ ERR_EXIT("connect"); } pid_t pid; pid=fork(); if(pid==-1){ ERR_EXIT("fork"); } else if(pid==0) { //child process receive message char recvbuf[1024]={}; int ret; while(1){ ret=read(socket_fd,recvbuf,sizeof(recvbuf)); if(ret<0) { ERR_EXIT("read failure"); } else if(ret==0){ printf("close\n"); exit(EXIT_SUCCESS); }else{ fputs(recvbuf,stdout); } memset(recvbuf,0,sizeof(recvbuf)); } }else { //parent process send message char sendbuf[1024]={}; while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){ write(socket_fd,sendbuf,strlen(sendbuf)); memset(sendbuf,0,sizeof(sendbuf)); } } close(socket_fd); return 0;}
- 运行截图
0 0
- Linux网络编程之简易的点对点聊天程序程序
- Linux网络编程学习笔记-简单点对点聊天程序--6
- 网络编程中简单的点对点聊天程序
- socket编程之点对点聊天程序
- LINUX网络编程,简单的聊天程序
- Linux网络编程之聊天程序(TCP协议之select)
- 点对点聊天程序
- 设计点对点聊天程序
- netty 点对点聊天程序
- Swing 之简易聊天程序
- iPhone之网络编程初体验-简单的聊天程序
- 黑马程序员_网络编程之简单的聊天程序
- 网络编程之简单的多人聊天程序
- 基于JSON的Ajax简易网络聊天程序(PHP)
- Unix网络编程之点对点聊天-客户端与服务器实现
- Java 网络编程之 (UDP网络聊天程序)
- Linux网络编程之聊天程序(TCP协议之fork进程)
- Linux上的网络聊天程序--多线程的服务器程序
- POJ 1182 食物链
- IIC与SPI学习总结 未完待续
- HDU 2602 Bone Collector(背包)
- 对象的创建
- 百度前端笔试题 css3画三角形
- Linux网络编程之简易的点对点聊天程序程序
- poj 3126 Prime Path(简单的DFS搜索)
- Android 自定义Camera(一)
- Opengl编程指南读书笔记-Opengl着色器
- python 正则表达式
- 利用Handler在主线程与子线程之间互发消息
- MySQL快速入门08----三大范式
- poj3480 John (nim博弈变形--SJ定理)
- win7频繁提示资源管理器已停止工作解决办法