最近在做一个产品的对接协议,由于板子的缺稀,只有一块无法网络挂载的板子,如果想要对接协议,必须让电脑和板子连通。一种方法是arm板连接电脑的wifi,此时的arm板wifi是station模式;另一种是电脑连接arm板的wifi,此时的arm板wifi是ap模式。这次我采用了第二种。
因为板子不可以连网,所以和电脑上的服务器和虚拟机都无法进行通信,此时可以通过arm版发射wifi,电脑连接arm的wifi;
电脑端
Windows直接在终端gcc编译,需要安装MinGW,
https://jingyan.baidu.com/article/0320e2c11564ca1b87507b8f.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <winsock.h>
#include <ws2tcpip.h>
//#include <pthread.h>
#include <assert.h>
#define MAXLINE 1000
#define SERVERPORT 2345 //端口号
#define SERVERIP "192.168.35.65"//要连接的服务器的ip
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"x86/pthreadVC2.lib")
int g_sockfd = 0;
int main(int argc, char * argv[])
{
WORD version;
version = MAKEWORD(1, 1);
WSADATA wsa; if(0 != WSAStartup(version, &wsa)){ // 初始化 socket
printf("WSAStartup error!\n");
exit(0);
}
int sockfd, n;
struct timeval timeout={10,0};//3s
char recvline[MAXLINE + 1];
char sendbuf[2048];
char recvbuf[2048];
struct sockaddr_in servaddr;
int ret ;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVERPORT);
servaddr.sin_addr.s_addr = inet_addr();
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("sockfd error!\n");
exit(0);
}
g_sockfd = sockfd;
printf("sockfd is %d\n", (int)sockfd);
if(connect(sockfd,(struct sockaddr *) & servaddr, sizeof(struct sockaddr)) <
0){
printf("connect error!\n");
exit(0);
}
printf("connect success\n");
/*
while((n = recv(sockfd, recvline, MAXLINE, 0)) > 0){
recvline[n] = 0;
if(fputs(recvline, stdout) == EOF){
printf("fputs error!\n");
exit(0);
}
} */
//ret=setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout));
while(1)
{
fgets(sendbuf, sizeof(sendbuf), stdin);
send(sockfd, sendbuf, sizeof(sendbuf), 0);
if (strcmp(sendbuf, "exit\n") == 0)
exit(0);
recv(sockfd, recvbuf, sizeof(recvbuf), 0);
printf("back data is %s\n",recvbuf);
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
if (n < 0)
printf("read error!");
exit(0);
return 0;
}
编译gcc host.c -o host -lwsock32
arm端
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<errno.h>
#include<net/if.h>
#include<net/if_arp.h>
#include<arpa/inet.h>
#include<sys/ioctl.h>
#include<errno.h>
#define PORT 2345
#define MAXSIZE 1024
int main(int argc, char *argv[])
{
int sockfd, newsockfd;
//定义服务端套接口数据结构
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_zise, portnumber;
int nNetTimeout=5000;//5秒,
//发送数据缓冲区
char buf[MAXSIZE];
//定义客户端套接口数据结构
int addr_len = sizeof(struct sockaddr_in);
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "create socket failed\n");
exit(EXIT_FAILURE);
}
puts("create socket success");
printf("sockfd is %d\n", sockfd);
//清空表示地址的结构体变量
bzero(&server_addr, sizeof(struct sockaddr_in));
//设置addr的成员变量信息
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
//设置ip为本机IP
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) < 0)
{
fprintf(stderr, "bind failed \n");
exit(EXIT_FAILURE);
}
puts("bind success\n");
if (listen(sockfd, 10) < 0)
{
perror("listen fail\n");
exit(EXIT_FAILURE);
}
puts("listen success\n");
int sin_size = sizeof(struct sockaddr_in);
printf("sin_size is %d\n", sin_size);
if ((newsockfd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) < 0)
{
perror("accept error");
exit(EXIT_FAILURE);
}
printf("accepted a new connetction\n");
printf("new socket id is %d\n", newsockfd);
printf("Accept clent ip is %s\n", inet_ntoa(client_addr.sin_addr));
printf("Connect successful please input message\n");
char sendbuf[1024];
char mybuf[1024];
//设置发送超时
//setsockopt(newsockfd,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
//setsockopt(newsockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
memset(sendbuf, 0 ,sizeof(sendbuf));
memset(buf, 0, sizeof(buf));
while (1)
{
recv(newsockfd, buf, sizeof(buf), 0);
printf("recvbuf=%s\n",buf);
if (strcmp(buf, "exit\n") == 0)
break;
send(newsockfd, buf, strlen(buf), 0);
memset(buf, 0, sizeof(buf));
//sleep(30);
}
close(newsockfd);
close(sockfd);
puts("exit success");
exit(EXIT_SUCCESS);
return 0;
}
交叉编译arm-linux-gcc service.c -o service
电脑连接板子的wifi,arm端先运行./server(service所在的目录)
再在Windows的cmd里运行host
电脑端