X86 Socket 通信
- struct txd_socket_handler_t {
- int fd;
- };
- txd_socket_handler_t *txd_tcp_socket_create() {
- txd_socket_handler_t *sock = (txd_socket_handler_t*)txd_malloc(sizeof(txd_socket_handler_t));
- return sock;
- }
- int32_t txd_tcp_socket_destroy(txd_socket_handler_t *sock) {
- if (sock) {
- txd_free(sock);
- }
- return ;
- }
- int32_t txd_tcp_connect(txd_socket_handler_t *sock, uint8_t *ip, uint16_t port, uint32_t timeout_ms) {
- struct sockaddr_in addr;
- struct timeval tv;
- fd_set wfds;
- int retval;
- socklen_t optlen;
- tv.tv_sec = timeout_ms / ;
- tv.tv_usec = (timeout_ms % ) * ;
- memset(&addr, , sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port);
- inet_pton(AF_INET, (char *)ip, &addr.sin_addr);
- // 创建socket,并设置为非阻塞(阻塞也是可以的)
- sock->fd = socket(AF_INET, SOCK_STREAM, );
- fcntl(sock->fd, F_SETFL, fcntl(sock->fd, F_GETFL) | O_NONBLOCK);
- // 尝试连接,返回0表示连接成功,否则判断errno,
- // 如果errno被设为EINPROGRESS,表示connect仍旧在进行
- if (connect(sock->fd, (struct sockaddr*)&addr, sizeof(addr)) == ) {
- return ;
- }
- if (errno != EINPROGRESS) {
- return -;
- }
- FD_ZERO(&wfds);
- FD_SET(sock->fd, &wfds);
- // 设置timeout,判断socket是否可写,如果可写,
- // 则用getsockopt得到error的值,若error值为0,表示connect成功
- retval = select(sock->fd + , NULL, &wfds, NULL, &tv);
- if (retval <= ) {
- return -;
- }
- optlen = sizeof(int);
- if (getsockopt(sock->fd, SOL_SOCKET, SO_ERROR, &retval, &optlen) < ) {
- return -;
- }
- if ( == retval) {
- return ;
- }
- return -;
- }
- int32_t txd_tcp_disconnect(txd_socket_handler_t *sock) {
- close(sock->fd);
- return ;
- }
- int32_t txd_tcp_recv(txd_socket_handler_t *sock, uint8_t *buf, uint32_t len, uint32_t timeout_ms) {
- struct timeval tv;
- fd_set rfds;
- int retval;
- tv.tv_sec = timeout_ms / ;
- tv.tv_usec = (timeout_ms % ) * ;
- FD_ZERO(&rfds);
- FD_SET(sock->fd, &rfds);
- retval = select(sock->fd + , &rfds, NULL, NULL, &tv);
- if (retval < ) {
- return -;
- }
- else if ( == retval) {
- return ;
- }
- // 不能保证全部读完,需要在上一层根据自己的协议做缓存
- retval = recv(sock->fd, buf, len, );
- if (retval <= && errno != ) {
- printf("========recv: retval[%d], errno[%d]======\n", retval, errno);
- return -;
- }
- return retval;
- }
- int32_t txd_tcp_send(txd_socket_handler_t *sock, uint8_t *buf, uint32_t len, uint32_t timeout_ms) {
- struct timeval tv;
- fd_set wfds;
- int retval;
- tv.tv_sec = timeout_ms / ;
- tv.tv_usec = (timeout_ms % ) * ;
- FD_ZERO(&wfds);
- FD_SET(sock->fd, &wfds);
- retval = select(sock->fd + , NULL, &wfds, NULL, &tv);
- if (retval < ) {
- return -;
- }
- else if ( == retval) {
- return ;
- }
- // 尽量将数据全部写到发送缓冲区
- uint32_t totlen = , n = len;
- while (totlen < n) {
- retval = send(sock->fd, buf + totlen, n - totlen, );
- if (retval < ) {
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
- continue; // 发送缓冲区阻塞,选择continue或者break
- }
- else if (errno == EINTR) { // 中断错误,继续写
- continue;
- }
- return -;
- }
- totlen += retval;
- }
- return totlen;
- }
X86 Socket 通信的更多相关文章
- HP-Socket国产优秀socket通信组件推荐
来源:http://blog.csdn.net/clb929/article/details/51085983 * HP-Socket 官方网站:http://www.jessma.org * HP- ...
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
随机推荐
- 使用Object类型的多态引用是会付出代价的
import java.util.*; public class FiveShi { String name; public void eat(){ System.out.println(" ...
- xtrabackup: error: last checkpoint LSN (3409281307) is larger than last copied LSN (3409274368)
1.错误发生场景:使用2.4.1版本的xtrabackup工具进行全备,备份日志中报出此错误2.知识要点:MySQL中,redo 日志写进程会在三种条件下被触发从log buffer中写日志到redo ...
- sql语句的匹配
like 的通配符有两种 %(百分号):代表零个.一个或者多个字符. _(下划线):代表一个数字或者字符. 1. name以"李"开头 where name like '李%' 2 ...
- CCF 201612-2 工资计算 java 解题
问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...
- 团队第二周:SRS文档
项目计划: 对于这次的实验,我们组计划进行一个图书管理系统的项目书写,在第一阶段,对该项目先进行一下规划,总结该项目的注意事项以及实验要求,并加以实施. 下面我先对我们项目的要求坐一下说明: 1定义五 ...
- Java(六)——抽奖系统
总体思路: 将编号加入ArrayList动态数组中,利用集合的静态方法Collections.shuffle() 乱序集合中的元素从而获得随机数,remove删除已抽编号 代码如下: import ...
- Nginx反向代理配置可跨域
由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...
- 创建【哆啦A梦】风格字体
学习canvas,为作画.对于一个毫无逻辑思维的人简直遭罪啊~想象坐标坐标坐标啊- - 好啦言归正传,基于本月16号,在春熙路IFS展出120只哆啦a梦,以及canvas的作用,在此介绍一种PS的美化 ...
- WPF学习笔记——依赖属性(Dependency Property)
1.什么是依赖属性 依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为"依赖对象". 依赖项属性通过调用 Regi ...
- coreData部分报错:This NSPersistentStoreCoordinator has no persistent stores.
最近在修改一个程序BUG的时候遇到一个问题coreData部分报错:This NSPersistentStoreCoordinator has no persistent stores. 但实际跑程序 ...