📄 netdemo.c
字号:
#include <stdio.h>
#include <string.h>
#include <rtos.h>
#include <ucore/error.h>
#include <ucore/rtos_bsdnet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define STD_IN 0
#define TCP_PORT 5000 /*端口号*/
#define UDP_PORT 5001
#define MAX_CONNECTIONS 4 /*同时连接的最大客户端数*/
#define MSG_SIZE 100 /*信息长度*/
void tcpServerTask(void* arg)
{
int fd = (int)arg;
char msg[MSG_SIZE];
int n;
OS_STATUS sc;
memset(msg , 0, MSG_SIZE);
if( (n = recv(fd, msg, sizeof(msg), 0)) > 0)
printf("Recv: %s \n", msg);
else
perror("recv");
close (fd);
sc = OSTaskDelete(OS_SELF);
if (sc != OS_OK) {
printf("Can't delete task \n");
return;
}
}
void tcpServer(void* arg)
{
struct sockaddr_in myAddr, farAddr;
int sFd, newFd;
int sockAddrSize;
unsigned32 tid;
unsigned32 my_priority;
OS_STATUS sc;
if((sFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return;
}
myAddr.sin_family = AF_INET;
myAddr.sin_port = htons (TCP_PORT);
myAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind (sFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) < 0)
{
perror("bind");
close(sFd);
return;
}
if (listen (sFd, MAX_CONNECTIONS) < 0)
{
perror("listen");
close(sFd);
return;
}
for(; ;) {
sockAddrSize = sizeof(farAddr);
if((newFd = accept(sFd, (struct sockaddr *)&farAddr, &sockAddrSize)) < 0)
{
perror("accept");
close(sFd);
return;
}
else
printf("ACCEPTED:%s\n", inet_ntoa(farAddr.sin_addr));
/*spawn task*/
OSTaskPriSet(OS_SELF, OS_CURRENT_PRI, &my_priority);
sc = OSTaskCreate("tcpServerTask",
my_priority,
8*1024,
OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
OS_NO_FP|OS_LOCAL,
&tid);
if (sc != OS_OK) {
printf("Can't create task \n");
return;
}
sc = OSTaskStart(tid, tcpServerTask, newFd);
if (sc != OS_OK) {
printf("Can't start task \n");
return;
}
}
}
void tcpClient(void)
{
struct sockaddr_in serverAddr;
int sFd;
int sockAddrSize;
char sendBuf[MSG_SIZE] = "This a message from tcpClient";
if((sFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return;
}
sockAddrSize = sizeof(struct sockaddr_in);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons (TCP_PORT);
serverAddr.sin_addr.s_addr = inet_addr("10.0.5.55");
if(connect(sFd, (struct sockaddr *)&serverAddr, sockAddrSize) < 0)
{
perror("connect");
close(sFd);
return;
}
if(send(sFd, sendBuf, sizeof(sendBuf), 0) < 0)
{
perror("send");
close(sFd);
return;
}
close(sFd);
}
void udpServer(void* arg)
{
struct sockaddr_in serverAddr, clientAddr;
int sockAddrSize;
int sFd;
char recvBuf[MSG_SIZE];
if((sFd = socket(AF_INET,SOCK_DGRAM, 0)) < 0)
{
perror("socket");
return;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(UDP_PORT);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockAddrSize = sizeof(struct sockaddr_in);
if(bind(sFd, (struct sockaddr *)&serverAddr, sockAddrSize) < 0)
{
perror("bind");
close(sFd);
return;
}
for(; ;) {
if(recvfrom(sFd, recvBuf, sizeof(recvBuf), 0,
(struct sockaddr *)&clientAddr, &sockAddrSize) < 0)
{
perror("recvfrom");
close(sFd);
return;
}
else
printf("RECV: %s \n", recvBuf);
}
}
void udpClient(void)
{
struct sockaddr_in serverAddr;
int sockAddrSize;
int sFd;
char sendBuf[MSG_SIZE] = "This a message from udpClient";
if((sFd = socket(AF_INET,SOCK_DGRAM, 0)) < 0)
{
perror("socket");
return;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(UDP_PORT);
serverAddr.sin_addr.s_addr = inet_addr("10.0.5.55");
sockAddrSize = sizeof(struct sockaddr_in);
if(sendto(sFd, sendBuf, sizeof(sendBuf), 0,
(struct sockaddr *)&serverAddr, sockAddrSize) < 0)
{
perror("sendto");
close(sFd);
return;
}
close(sFd);
}
void doSock(void)
{
unsigned32 tid1, tid2;
unsigned32 my_priority;
OS_STATUS sc;
/*spawn tcpserver task*/
OSTaskPriSet(OS_SELF, OS_CURRENT_PRI, &my_priority);
sc = OSTaskCreate("tcpServer",
my_priority,
8*1024,
OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
OS_NO_FP|OS_LOCAL,
&tid1);
if (sc != OS_OK) {
printf("Can't create task \n");
return;
}
sc = OSTaskStart(tid1, tcpServer, 0);
if (sc != OS_OK) {
printf("Can't start task \n");
return;
}
/*spawn udpserver task*/
sc = OSTaskCreate("udpServer",
my_priority,
8*1024,
OS_PREEMPT|OS_NO_TIMESLICE|OS_NO_ASR|OS_INTERRUPT_LEVEL(0),
OS_NO_FP|OS_LOCAL,
&tid2);
if (sc != OS_OK) {
printf("Can't create task \n");
return;
}
sc = OSTaskStart(tid2, udpServer, 0);
if (sc != OS_OK) {
printf("Can't start task \n");
return;
}
for(;;) {
switch(getchar()) {
case 'q':
return;
case 't':
tcpClient();
break;
case 'u':
udpClient();
break;
case 's':
rtos_bsdnet_show_if_stats();
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -