Windows与arm开发板之间的sock通信

最近在做一个产品的对接协议,由于板子的缺稀,只有一块无法网络挂载的板子,如果想要对接协议,必须让电脑和板子连通。一种方法是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
电脑端
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值