linux如何抓取本地socket,linux 本地socket

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)) 

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)) 

LOGE("bind error");

if (listen(listenfd, SOMAXCONN) 

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)) 

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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值