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 ...
随机推荐
- linux -a 到 -z 的意义
shell if判断中常用的也就是绿色部分,尾部部分越看越不懂.从百度文库转载. [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则 ...
- IOS中的编码规范
1.指导原则 [原则1-]首先是为人编写程序,其次才是计算机. 说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发.测试.生产.用户使用.版本升级和后期维护等长期过程,只有易读.易维护的软件代 ...
- Counting Bits(Difficulty: Medium)
题目: Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate ...
- jqGrid属性中文详细说明 (转)
jqGrid的属性很多,其实很大部分的属性,使用其默认值就可以了.但是详细了解一下属性的含义以及作用,对我们定制自己的grid是有帮助的. 以下内容描述格式是:属性名称 参数值类型 描述内容(可 ...
- ASP.NET 中HTML和Form辅助方法
Form辅助方法 Form最重要的属性就是action和method,action指明form中的数据被提交到哪里,method指明用什么方法,默认为GET,下面是一个简单的例子: <form ...
- iOS学习之git的使用
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器.集中式版本控 ...
- JS总结 节点
nodeName 获取节点名称 元素节点:返回标记名称 属性节点:返回属性名称 文本节点:返回文本#text nodeTyle 获取节点类型 元素节点:返回1 属性节点:返回2 文本节点:返回3 n ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- 动态生成tr,并将其下控件的值拼接后传到后台并保存
有两个表(主表和子表),现在需要根据主表某一个字段动态的生成记录(一条记录就一个tr),然后再讲tr下控件的各个值取出来,传到后台,并保存到子表. html代码: <!--#for(Record ...
- 自增序号,而且默认变量就是$i,也就是说在你的volist标签之内,可以直接使用$i
<volist name="vlist" id="v"> <{$i}> // 直接使用$i </volist>