文档章节

linux 本地socket

t
 taoanran
发布于 2014/05/08 09:33
字数 422
阅读 125
收藏 3
点赞 0
评论 0
server 端:

void *recvData(void *arg)
{
    char recvbuf[1024];
    int conn = *(int *)arg;
    while(1)
    {
        memset(recvbuf,0,1024);
        recv(conn, recvbuf, sizeof(recvbuf),0);
    }
}

main 函数:
int listenfd;
int conn;
char sendbuf[1024];
char recvbuf[1024];
char sig_strength[16];
char radio_if[16];
if ((listenfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
    LOGE("socket error");
unlink("/tmp/test_socket"); //地址复用
struct sockaddr_un servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sun_family = AF_UNIX;
strcpy(servaddr.sun_path, "/tmp/test_socket");
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    LOGE("bind error");
if (listen(listenfd, SOMAXCONN) < 0)
    LOGE("listen error");
while(1)
{
    conn = accept(listenfd, NULL, NULL);
    if (conn == -1)
    {
        if (conn == EINTR)
            continue;
    }
    pthread_create(&thread_socket_recv, NULL, recvData, &conn);
    
    while(1)
    {
        memset(sendbuf,0,1024);
        strncpy(sendbuf,"xxxx, strlen("xxx"));
        send(conn, sendbuf, strlen(sendbuf),0);
    }
    close(conn);
    close(listenfd);
}

client端(非阻塞socket)
typedef struct QMISocket{
int socketfd;
struct timeval timeout;
pthread_mutex_t mMutex;
}QMISocket;
extern QMISocket mSocket;

static int sockConnect()
{
    struct sockaddr_un servaddr;
    int retval ;
    fd_set set;
    int flags;
    int ret=-1;
    
    if ((mSocket.socketfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
        printf("socket error");
    mSocket.timeout.tv_sec = 3;
    mSocket.timeout.tv_usec = 0;
    setsockopt(mSocket.socketfd,SOL_SOCKET,SO_SNDTIMEO,(char *)&(mSocket.timeout),sizeof(struct timeval));
    setsockopt(mSocket.socketfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&(mSocket.timeout),sizeof(struct timeval));
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sun_family = AF_UNIX;
    strcpy(servaddr.sun_path, "/tmp/test_socket");
    flags = fcntl(mSocket.socketfd, F_GETFL, 0);
    fcntl(mSocket.socketfd, F_SETFL, flags | O_NONBLOCK);
    ret = connect(mSocket.socketfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    if (0 == ret)
    {
        printf("connected\n");
    }
    else{
        if (errno != EINPROGRESS)
        {
		perror("connect");
		return-1;
	}
	FD_ZERO(&set);
	FD_SET(mSocket.socketfd,&set);
	retval = select(mSocket.socketfd+ 1,NULL, &set,NULL,&mSocket.timeout);
	if(retval==-1)
	{
	    perror("select");
	    return -1;
	}
	else if(retval== 0)
	{
		fprintf(stderr,"timeout\nn");
		printf("%d\n",time(NULL));
		return 0;
	}
	printf("connected\n");
	}
    }
    flags = fcntl(mSocket.socketfd, F_GETFL, 0);
    fcntl(mSocket.socketfd, F_SETFL, flags & ~O_NONBLOCK);
    return mSocket.socketfd;
}

int main()
{
    while(1)//wait the reboot-daemon
    {
        if (sockConnect() > 0)
            break;
        sleep(1);
    }
    while(1)
    {
        char recvbuf[1024]={0};  
        ret = recv(mSocket.socketfd, recvbuf, sizeof(recvbuf),0);
    }
}

这里在recv的时候,如果send端发送非常快,那么可能会导致一次recv到多个数据包的情况,那可需要在每个数据包结尾打上标记,表示一个个数据包。recv根据这些flags去截取每一个数据包

char  *remainBuf = NULL;
remainBuf = recvbuf;
char *tmp = strstr(remainBuf, "@");
memset(key,0,1024);
if (tmp != NULL)
{
	strncpy(key, remainBuf, tmp - remainBuf);
	remainBuf = remainBuf+(tmp - remainBuf)+1;
}


© 著作权归作者所有

共有 人打赏支持
t
粉丝 7
博文 63
码字总数 7186
作品 0
南京
Linux进程和线程间IPC机制

Linux进程间IPC 1.管道(Pipe)及有名管道(named pipe): 1、管道是半双工的,要实线读写需建立两根管道; 2、匿名管道用于父子进程或者兄弟进程之间(如forkexec创建的进程),命名管道允许没...

dodonei ⋅ 04/16 ⋅ 0

关于/proc/$pid/fd socket:[number]

(转载自:https://blog.csdn.net/lkkey80/article/details/16856063) 众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd。当然有些可能不是本进程自己打开的,如通过for...

shangluyi ⋅ 05/09 ⋅ 0

Linux网络编程之Socket初探

Socket由来 Socket 的英文原意就是“孔”或“插座”,现在,作为 BSD UNIX 的进程通讯机制,取其后一种意义。一起看下网络编程里说的socket定义: 每一个 Socket 都用一个半相关描述:{协议,...

霸气逆流 ⋅ 01/21 ⋅ 0

Linux上安装二进制文件MySQL详解

Linux上安装二进制文件MySQL详解 前言:昨天晚上搞了很久,终于搞清楚mysql的安装配置了,我真是太low了。当我在云服务器上登进Mysql时,真是高兴哈哈,咱一步一步来,彻底搞懂Mysql的安装配...

xiaocao13140 ⋅ 05/23 ⋅ 0

Linux网络编程——原始套接字编程

原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据。区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机...

tennysonsky ⋅ 2015/03/27 ⋅ 0

嵌入式Linux学习基础规划篇

嵌入式的学习是需要日积月累的,是通过一点一滴的积累才能成为大神。下面来介绍一下嵌入式linux学习基础规划,目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质...

创客学院 ⋅ 04/10 ⋅ 0

5.4节呈献:HP-Socket v5.3.1 发布 — 支持 Android NDK

项目主页 : http://www.oschina.net/p/hp-socket 开发文档 : http://www.docin.com/p-2079016612.html 下载地址 : https://gitee.com/ldcsaa/HP-Socket QQ Group: 75375912, 44636872 HP-Soc......

伤神小怪兽 ⋅ 05/04 ⋅ 0

linux中使用ssh保持会话链接,自动登录

在linux的终端下登录server后,新开一个终端,再次登录,依然需要输入密码,securecrt有会话clone功能,不用再次输入密码。linux的ssh作些设置也可以实现类似功能 编辑.ssh/config,添加如下...

757781091 ⋅ 06/08 ⋅ 0

Linux网络编程:什么是Linux下的网络编程?

想知道Linux下的网络编程培训×××?先来了解一下什么是Linux下的网络编程吧!Linux下的网络编程指的是socket套接字编程,入门比较简单。在学校里学过一些皮毛,平时就是自学玩,没有见识过...

长沙千锋 ⋅ 05/23 ⋅ 0

【PYTHON模块】paramiko模块与主机SSH连接

还记得前一节做的socket和socketserver吗?写了很多实现了一个小功能,但是今天的paramiko真让人有种土枪换炮的感觉! paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证...

等你的破船 ⋅ 04/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 26分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 32分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 34分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 43分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 46分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 今天 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部