文档章节

linux 本地socket

t
 taoanran
发布于 2014/05/08 09:33
字数 422
阅读 125
收藏 3
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
博文 64
码字总数 7186
作品 0
南京
使用ssh隧道+privoxy实现Linux全局代理

使用ssh隧道+privoxy实现Linux全局代理 ssh简介 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,...

aaronchou0
07/18
0
0
用 python 获取本地/公网 ip 地址

1、Windows下2种方法: 1. 使用拨号上网的话,一般都有一个本地ip和一个外网ip,使用python可以很容易的得到这两个ip 使用gethostbyname和gethostbyname_ex两个函数可以实现 import socket lo...

大数据之路
2012/08/11
0
0
不要在为唯一的port号烦恼了

老式的写法: ServerSocket srv = new ServerSocket(portNumber) 与时俱进的例子: (那也是相对于2008年了) ServerSocket srv = new LocalServerSocket("a.b.c"); 参数其实随便什么string都...

Q_J
2015/05/27
0
0
Linux下端口复用(SO_REUSEADDR与SO_REUSEPORT)(转载)

http://blog.chinaunix.net/uid-7390305-id-2057201.html 作者:迷失千夏——拾露赏云 解决性参考:Currently, Linux does not allow reuse of same local port for both TCP server and TC......

老汉-憨憨
2014/12/08
0
0
4.3 现在可用的客体类有哪些呢

版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/47781911 在这一小节中我们将要介绍一下在FC4中可用的内核客体类.我们的目标是描述...

陈洪波
2015/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python深体验,常见的数据处理方式(必须要懂的)

1.缺失值处理 - 拉格朗日插值法 input_file数据文件内容(存在部分缺失值): from scipy.interpolate import lagrangeimport pandas as pdimport numpy as npinput_file = './dat...

无也Python
24分钟前
2
0
Spring MVC注解故障追踪记

Spring MVC是美团点评很多团队使用的Web框架。在基于Spring MVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,...

Skqing
25分钟前
4
0
区块链入门教程以太坊源码分析cmd包分析

  兄弟连区块链入门教程以太坊源码分析cmd包分析。 ### cmd包概述 * geth 主要Ethereum CLI客户端。它是Ethereum网络(eth主网,测试网络或私有网)的入口点,使用此命令可以使节点作为ful...

兄弟连区块链入门教程
27分钟前
1
0
@Autowired 报红线

代码可正常跑,不过红线看着有点难受,解决方案 使用@Autowired(required=false) 或者@Resource. 这两者区别网上一大堆

斩神魂
33分钟前
1
0
DataTable中检索信息 (C#)

C#_从DataTable中检索信息 存在于内存中的虚拟表DataTable,绑定在数据显示控件后,如果想在再检索其中某些信息,可以利用DataTable.Select方法进行检索,避免了重复的读取数据库。Select方法...

CS-CS01
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部