linux socket网络编程实例
来源:互联网 发布:真空上街 知乎 编辑:程序博客网 时间:2024/05/18 20:10
在工作中,用到各种框架,基本都是将底层的通讯给封装好了,于是想自己动动手,光看看老是忘记。一下例子为使用socket tcp实现的一个简单的例子,即是一个echo模型的简单聊天室服务,服务端启动后,等待客户端连接,如果客户端连接进来,则创建一个子进程来处理客户端的io。注意:本例子单纯的使用tcp长连接,当连接数量大时,服务器会宕机,这个时候应使用更高效的epoll来实现。直接上代码如下:
本例子只有2个文件socketserver.cpp 和socketclient.cpp,sockt相关的一些函数可以参考其它博文,这里暂不赘述。
socket..cpp文件:
#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#define PORT 8010int main (int argc, char **argv){int server_fd, connect_fd;sockaddr_in serveraddr;server_fd = socket(AF_INET, SOCK_STREAM, 0);if(server_fd == -1){printf("create socket err:%s,errno:%d\n",strerror(errno),errno);return 1;}memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);serveraddr.sin_port = htons(PORT);int result = bind(server_fd, (struct sockaddr*) &serveraddr, sizeof(serveraddr));if(result == -1){printf("bind socket err:%s,errno:%d\n",strerror(errno),errno);return 1;}result = listen(server_fd, 10);if(result == -1){printf("listen socket err:%s,errno:%d\n",strerror(errno),errno);return 1;}while(true){printf("==server is ok, ready for accept:\n");connect_fd = accept(server_fd, (struct sockaddr*) NULL,NULL);if(connect_fd == -1){printf("connect err:%s,errno:%d",strerror(errno),errno);continue;}printf("==accept fd:%d\n",connect_fd);int pid = fork();if(pid == 0){char buff[4096] = "";while(true){int recvlen = recv(connect_fd, buff, sizeof(buff), 0);if(recvlen == 0 || strcmp(buff,"quit") == 0){break;}buff[recvlen] = '\0';printf("==recv msg from client msg:%s,fd:%d\n", buff,connect_fd);int sendresult = send(connect_fd, buff, strlen(buff), 0);if(sendresult == -1){break;}}close(connect_fd);}close(connect_fd);}close(server_fd);return 0;}编译:g++ -o server.out socktserver.cpp
socketclient.cpp文件:
#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <iostream>#include <arpa/inet.h>#define STRIP "127.0.0.1"#define PORT 8010int main(int argc, char **argv){int socketfd;sockaddr_in serveraddr;socketfd = socket(AF_INET, SOCK_STREAM, 0);if(socketfd < 0){printf("create socket err:%s,errno:%d\n",strerror(errno),errno);return 1;}memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(PORT);if(inet_pton(AF_INET, STRIP, &serveraddr.sin_addr) <= 0){printf("inet_pton err:%s,errno:%d\n",strerror(errno),errno);return 1;}int result = connect(socketfd,(struct sockaddr*) &serveraddr, sizeof(serveraddr));if(result< 0){printf("connect socket err:%s,errno:%d\n",strerror(errno),errno);return 1;}char buff[1024];char recvbuff[1024];while(std::cin >> buff){printf("==send msg to server:%s\n",buff);result = send(socketfd, buff,sizeof(buff),0);if(result <= 0){printf("send msg:%s err:%s,errno:%d",buff,strerror(errno),errno);break;}int recvlen = recv(socketfd, recvbuff, sizeof(recvbuff), 0);if(recvlen <= 0){printf("recv err:%s,errno:%d",strerror(errno),errno);break;}recvbuff[recvlen] = '\0';printf("==recv msg from server:%s\n",recvbuff);}close(socketfd);return 0;}编译:g++ -o client.out socketclient.cpp
阅读全文
0 0
- linux socket网络编程实例
- 网络编程socket实例
- Linux Socket编程 实例
- Linux Socket编程 实例
- linux Socket编程实例
- 嵌入式linux下socket网络通信编程实例一
- linux C 简单socket网络编程的实例
- linux学习之——网络 socket 编程实例
- Linux的简单的socket网络编程实例
- linux 网络编程 socket
- Linux Socket 网络编程
- Linux网络socket编程
- Linux网络编程(socket)
- Linux Socket 网络编程
- linux网络编程 socket
- PHP socket 网络编程实例
- PHP socket 网络编程实例
- Socket网络编程-Mina 实例
- 从c语言中常用变量的生命周期,作用域,默认值,内存区域及链接属性
- vue.js 表单控件 输入绑定 v-model的使用
- vnc, vncserver, ssh的locale问题
- 大型网站技术架构
- 升级OSX High Sierra 10.13遇到一些问题及解决方法
- linux socket网络编程实例
- 自制ToolBox,支持自由展开多组
- typedef
- [C++技巧篇1]enable_if,lambda
- string相关的函数
- 结构体的大小
- MyBatis的Mapper接口以及Example的实例函数及详解
- 内存重叠
- SQLAlchemy用法指南