1.运行在ubuntu上的测试程序:
define SERVER_PORT 9999
/*
电脑端的测试应用程序
用法 ./app send 不停的发送数据
./app rece 不停的接受数据
(注意先会发送一数据,然后再接收,
先发送一数据的原因是服务器收到的地址信息,保存
在结构体中,然后将对应的地址信息发送数据)
*/
注意下面的程序是 udp————SOCK_DGRAM tcp———————–SOCK_STREAM
UDP 建立socket 后,就可以直接调用sendto recvfrom 函数往对应的地址发送数据。
int main(int argc, char **argv)
{
int iSocketClient;
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
int iRet;
unsigned char ucRecvBuf[1000];
int iSendLen;
int iRecvLen;
int iAddrLen;
if(argc!=2)
{
printf("usage ./appxxx send or ./appxxx rece \n");
return 1;
}
iSocketClient = socket(AF_INET, SOCK_DGRAM, 0); udp协议
tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net, short */
//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
if (0 == inet_aton("192.168.1.201", &tSocketServerAddr.sin_addr)) // 开发板的第2个端口的网络地址,开发板是服务器
{
printf("invalid server_ip\n");
return -1;
}
memset(tSocketServerAddr.sin_zero, 0, 8);
/* 发送数据 */
iAddrLen = sizeof(struct sockaddr);
if(strcmp(argv[1],"send")==0)
{
while (1)
{
iSendLen = sendto(iSocketClient, "setclient", 9, 0,
(const struct sockaddr *)&tSocketServerAddr, iAddrLen);
/* 循环: 从网络读数据, 打印出来 */
iAddrLen = sizeof(struct sockaddr);
//printf("send \n");
// recvfrom(iSocketClient, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketServerAddr, &iAddrLen);
// printf("%s\n",ucRecvBuf);
}
}
else if(strcmp(argv[1],"rece")==0)
{
printf("receive \n");
iSendLen = sendto(iSocketClient, "setclient", 9, 0,
(const struct sockaddr *)&tSocketServerAddr, iAddrLen);
while(1)
{
/* 循环: 从网络读数据, 打印出来 */
iAddrLen = sizeof(struct sockaddr);
//printf("send \n");
recvfrom(iSocketClient, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketServerAddr, &iAddrLen);
printf("receive arm-linux server send data,val is %s,ip addr is %s\n", ucRecvBuf, inet_ntoa(tSocketServerAddr.sin_addr));
}
}
return 1;
}
2.开发板的程序: 开发板做为服务器:
#define Net2SERVER_PORT 9999
char *net2_ServerIpAddr="192.168.1.201"; // 开发板的Ip地址
int g_iSocketServerNet2_fd;
struct sockaddr_in g_tSocketServerNet2Addr;
struct sockaddr_in g_tSocketClientNet2Addr;
static int Net2Init()
{
/* socket初始化 */
int iRet;
g_iSocketServerNet2_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == g_iSocketServerNet2_fd)
{
printf("net2 socket error!\n");
return -1;
}
g_tSocketServerNet2Addr.sin_family = AF_INET;//IP V4 协议
g_tSocketServerNet2Addr.sin_port = htons(Net2SERVER_PORT); /* host to net, short */
//g_tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
//本地服务器 ip地址
if (0 == inet_aton(net2_ServerIpAddr, &g_tSocketServerNet2Addr.sin_addr))
{
printf("invalid net2 server_ip\n");
return -1;
}
memset(g_tSocketServerNet2Addr.sin_zero, 0, 8);
//将本地的ip地址与端口号绑定
iRet = bind(g_iSocketServerNet2_fd, (const struct sockaddr *)&g_tSocketServerNet2Addr, sizeof(struct sockaddr));
if (-1 == iRet)
{
printf("Net2 bind seting error!\n");
return -1;
}
/*
//设置发送的客户端的信息
g_tSocketClientNet2Addr.sin_family= AF_INET;//IP V4 协议
g_tSocketClientNet2Addr.sin_port = htons(Net2SERVER_PORT);
if (0 == inet_aton("192.168.1.199", &g_tSocketClientNet2Addr.sin_addr))
{
printf(" 192.168.1.199 invalid net2 server_ip\n");
return -1;
}
*/
return 1;
}
/*Net1Task 作为 client */
void Net2SendTask()
{
Net2Init();
static char strTmpBuf[512]={"lxl is debuging net2 ,net2 server send data \n"};
static int iAddrLen = sizeof(struct sockaddr);
static int iSendLen;
// 测试程序先send 再rec,所以先收到数据,得到客户端的ip地址
//然后向客户端的IP地址发送数据
while (1)
{
iSendLen = sendto(g_iSocketServerNet2_fd, strTmpBuf, sizeof(strTmpBuf), 0,
(const struct sockaddr *)&g_tSocketClientNet2Addr, iAddrLen);
sleep(5);
}
pthread_join(net2send_pthread_t, NULL);
printf("Net2Send_pthread_t exit \n");
}
void Net2RecTask()
{
sleep(5); // 保证 net1task 调用网络初始化后再执行下面的操作
socklen_t iAddrLen;
int iRecvLen;
char ucRecvBuf[1000];
struct sockaddr_in tSocketNet2ClientAddr;
while (1)
{
printf("Net2RecTask \n");
/* 读取客户端发来的数据 */
iAddrLen = sizeof(struct sockaddr);
// 收到绑定端口的数据,将 客户 端IP地址 存储在tSocketClientAddr上
iRecvLen = recvfrom(g_iSocketServerNet2_fd, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketNet2ClientAddr, &iAddrLen);
if (iRecvLen > 0)
{
ucRecvBuf[iRecvLen] = '\0';
printf("%s\n", ucRecvBuf);
}
g_tSocketClientNet2Addr=tSocketNet2ClientAddr; // 赋值给send 函数
printf("Send Net2 Client ipaddr is %s \n",inet_ntoa(tSocketNet2ClientAddr.sin_addr) );
}
pthread_join(net2rec_pthread_t, NULL);
printf("Net2Rec Task exit \n");
}