linux上客户端绑定固定端口请求server
来源:互联网 发布:女式腰带淘宝网 编辑:程序博客网 时间:2024/06/03 10:07
linux上客户端绑定固定端口请求server, 这样可以用客户端的固定端口去请求不同的server
#include <iostream>#include <sys/select.h>#include <sys/socket.h>#include <unistd.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string>#include <string.h>#include <event.h>using namespace std;#define BUF_SIZE 1024#define LOCAL_PORT 9092#define FAULT_SERVER_PORT 9091/** * 客户端绑定固定端口 去 连接到server端 */int connectServer(char* ip, int port) { int flags = 1; int fd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *) &flags, sizeof(flags)); /* 客户端绑定固定端口*/ sockaddr_in localAddr; bzero(&localAddr, sizeof(localAddr)); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(LOCAL_PORT); bind(fd, (const sockaddr*) &localAddr, sizeof(localAddr)); if (-1 == fd) { cout << "Error, connectServer() quit" << endl; return -1; } struct sockaddr_in remote_addr; //服务器端网络地址结构体 memset(&remote_addr, 0, sizeof(remote_addr)); //数据初始化--清零 remote_addr.sin_family = AF_INET; //设置为IP通信 remote_addr.sin_addr.s_addr = inet_addr(ip); //服务器IP地址 remote_addr.sin_port = htons(port); //服务器端口号 int con_result = connect(fd, (struct sockaddr*) &remote_addr, sizeof(struct sockaddr)); if (con_result < 0) { cout << "Connect Error!" << endl; close(fd); return -1; } return fd;}void on_read(int sock, short event, void* arg) { char* buffer = new char[BUF_SIZE]; memset(buffer, 0, sizeof(char) * BUF_SIZE); //--本来应该用while一直循环,但由于用了libevent,只在可以读的时候才触发on_read(),故不必用while了 int size = read(sock, buffer, BUF_SIZE); if (0 == size) { //说明socket关闭 cout << "read size is 0 for socket:" << sock << endl; return; } cout << "Received from server---" << buffer << endl; delete[] buffer;}void* init_read_event(void* arg) { long long_sock = (long) arg; int sock = (int) long_sock; //-----初始化libevent,设置回调函数on_read()------------ struct event_base* base = event_base_new(); struct event* read_ev = (struct event*) malloc(sizeof(struct event)); //发生读事件后,从socket中取出数据 event_set(read_ev, sock, EV_READ | EV_PERSIST, on_read, NULL); event_base_set(base, read_ev); event_add(read_ev, NULL); event_base_dispatch(base); //-------------- event_del(read_ev); free(read_ev); event_base_free(base);}/*** 创建一个新线程,在新线程里初始化libevent读事件的相关设置,并开启event_base_dispatch*/void init_read_event_thread(int sock) { pthread_t thread; pthread_create(&thread, NULL, init_read_event, (void*) sock); pthread_detach(thread);}int main() { cout << "main started" << endl; // prints Hello World!!! cout << "Please input server IP:" << endl; char ip[16]; cin >> ip; cout << "Please input port:" << endl; int port; cin >> port; cout << "ServerIP is " << ip << " ,port=" << port << endl; int socket_fd = connectServer(ip, port); cout << "socket_fd=" << socket_fd << endl; init_read_event_thread(socket_fd); //-------------------------- char buffer[BUF_SIZE]; bool isBreak = false; while (!isBreak) { cout << "Input your data to server(\'q\' or \"quit\" to exit)" << endl; cin >> buffer; if (strcmp("q", buffer) == 0 || strcmp("quit", buffer) == 0) { isBreak = true; close(socket_fd); break; } cout << "Your input is " << buffer << endl; int write_num = write(socket_fd, buffer, strlen(buffer)); cout << write_num << " characters written" << endl; sleep(1); } return 0;}
0 0
- linux上客户端绑定固定端口请求server
- RMI IP绑定和端口固定
- flask 在 linux 和 windows 上的端口绑定问题。
- EAS客户端登录windows server 2008上EAS服务端的端口问题。
- linux 绑定端口号失败
- tomcat请求处理分析(三) 绑定本地端口监听请求
- Linux服务器上Tomcat6绑定80端口提示java.net.BindException: Permission denied <null>:80
- linux查看端口请求数量
- socket C/C++编程(4)Server端向OS请求sockets资源进行server端开放端口号的绑定
- sql server客户端连接自定义端口
- DataGridView将数据内容绑定到固定的列上
- 为什么客户端不需要绑定IP地址和端口号
- linux socket和UDP 源端口绑定
- linux中绑定80端口失败
- Linux普通用户利用authbind绑定特权端口
- 在linux上配置固定ip地址
- Linux 上开通1521 端口
- #Linux NFS服务 固定端口及防火墙配置#
- 51 Nod 1289 大鱼吃小鱼(栈,模拟)
- Zookeeper安装与部署
- oracle忘记密码怎么办?
- ucloud时间和aws时间不同步的问题
- Html制作圆,球
- linux上客户端绑定固定端口请求server
- Ubuntu 16.04: How to resolve libqt5x11extras5 (>= 5.1.0) but it is not going to be installed
- 计算机视觉方面的数据集收藏(CV Datasets on the web)
- 分布式系统原理
- 内存对齐详解
- 探索HashMap实现原理及其在jdk8数据结构的改进
- 2017 ICM/MCM A题 管理赞比西河 Managing The Zambezi River
- scala 快速排序与合并排序
- 通过HTTP响应头让浏览器自动刷新