1 Linux
系统的
UDP
通讯
Linux
系统下的
Server
端:
/*********************************************************************
文件:
Server.c
作者:
Sayigood
时间:
2008/5/8
说明:
server
端
: open a socket(socket)--->name the socket(bind)---> send
and receive data(sendto recvfrom)--->close socket(closesocket)
*********************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sock;
//sendto 中使用的对方地址
struct sockaddr_in toAddr;
// 在 recvfrom 中使用的对方主机地址
struct sockaddr_in fromAddr;
{
int sock;
//sendto 中使用的对方地址
struct sockaddr_in toAddr;
// 在 recvfrom 中使用的对方主机地址
struct sockaddr_in fromAddr;
int recvLen;
unsigned int addrLen;
char recvBuffer[1024]="/0";
unsigned int addrLen;
char recvBuffer[1024]="/0";
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock < 0)
{
printf(" 创建套接字失败了 ./r/n");
exit(0);
}
{
printf(" 创建套接字失败了 ./r/n");
exit(0);
}
memset(&fromAddr,0,sizeof(fromAddr));
fromAddr.sin_family=AF_INET;
fromAddr.sin_addr.s_addr=htonl(INADDR_ANY);
fromAddr.sin_port = htons(4000);
fromAddr.sin_family=AF_INET;
fromAddr.sin_addr.s_addr=htonl(INADDR_ANY);
fromAddr.sin_port = htons(4000);
if(bind(sock,(struct sockaddr*)&fromAddr,sizeof(fromAddr))<0)
{
printf("bind() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
{
printf("bind() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
while(1){
addrLen = sizeof(toAddr);
printf("sendto 2/r/n");
if((recvLen = recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(struct sockaddr*)&toAddr,&addrLen))>=0)
{
//printf("()recvfrom() 函数使用失败了 ./r/n");
//exit(1);
//}
printf("recvfrom() result:%s/r/n",recvBuffer);
if(sendto(sock,recvBuffer,recvLen,0,(struct sockaddr*)&toAddr,sizeof(toAddr))!=recvLen){
printf("sendto fail/r/n");
exit(0);
}
printf("equal/r/n");
//sendto(sock,recvBuffer,recvLen,0,(struct sockaddr*)&toAddr,sizeof(toAddr));
}
printf("sendto 3/r/n");
}
return 0;
}
printf("sendto 2/r/n");
if((recvLen = recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(struct sockaddr*)&toAddr,&addrLen))>=0)
{
//printf("()recvfrom() 函数使用失败了 ./r/n");
//exit(1);
//}
printf("recvfrom() result:%s/r/n",recvBuffer);
if(sendto(sock,recvBuffer,recvLen,0,(struct sockaddr*)&toAddr,sizeof(toAddr))!=recvLen){
printf("sendto fail/r/n");
exit(0);
}
printf("equal/r/n");
//sendto(sock,recvBuffer,recvLen,0,(struct sockaddr*)&toAddr,sizeof(toAddr));
}
printf("sendto 3/r/n");
}
return 0;
}
Linux
系统下的
Client
端:
/*********************************************************************
文件:
Client.c
作者:
Sayigood
时间:
2008/5/8
说明:
client
端
:open a socket(socket)--->send and receive data(sendto recvfrom)
--->close socket(closesocket)
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf(" 请输入要传送的内容 ./r/n");
exit(0);
}
int sock;
//sendto 中使用的对方地址
struct sockaddr_in toAddr;
// 在 recvfrom 中使用的对方主机地址
struct sockaddr_in fromAddr;
{
if(argc < 2)
{
printf(" 请输入要传送的内容 ./r/n");
exit(0);
}
int sock;
//sendto 中使用的对方地址
struct sockaddr_in toAddr;
// 在 recvfrom 中使用的对方主机地址
struct sockaddr_in fromAddr;
unsigned int fromLen;
char recvBuffer[1024]="/0";
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
char recvBuffer[1024]="/0";
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock < 0)
{
printf(" 创建套接字失败了 ./r/n");
exit(1);
}
{
printf(" 创建套接字失败了 ./r/n");
exit(1);
}
memset(&toAddr,0,sizeof(toAddr));
toAddr.sin_family=AF_INET;
toAddr.sin_addr.s_addr=inet_addr("192.192.192.190");
toAddr.sin_port = htons(4000);
while(1){
//printf("input message/n");
//scanf("%s",recvBuffer);
if(sendto(sock,argv[1],strlen(argv[1]),0,(struct sockaddr*)&toAddr,sizeof(toAddr)) != strlen(argv[1]))
{
printf("sendto() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
toAddr.sin_family=AF_INET;
toAddr.sin_addr.s_addr=inet_addr("192.192.192.190");
toAddr.sin_port = htons(4000);
while(1){
//printf("input message/n");
//scanf("%s",recvBuffer);
if(sendto(sock,argv[1],strlen(argv[1]),0,(struct sockaddr*)&toAddr,sizeof(toAddr)) != strlen(argv[1]))
{
printf("sendto() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
fromLen = sizeof(fromAddr);
if(recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(struct sockaddr*)&fromAddr,&fromLen)<0)
{
printf("()recvfrom() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
printf("end");
printf("recvfrom() result:%s/r/n",recvBuffer);
}
close(sock);
return 0;
}
if(recvfrom(sock,recvBuffer,sizeof(recvBuffer),0,(struct sockaddr*)&fromAddr,&fromLen)<0)
{
printf("()recvfrom() 函数使用失败了 ./r/n");
close(sock);
exit(1);
}
printf("end");
printf("recvfrom() result:%s/r/n",recvBuffer);
}
close(sock);
return 0;
}
用的
makefile
文件是:
#
# Makefile for Linux application test example.
#
#---------------------------------------------------------------
# Linux application Makefile sample
# make -- the optical output without debug info
# make DEBUG=1 -- debug info include
# make clean -- clean the object file(s)
# make install -- install the execute file(s) to INSTALLDIR
#---------------------------------------------------------------
# History :
# Program start, Embest R.X.Huang 2005.6.5
# Makefile for Linux application test example.
#
#---------------------------------------------------------------
# Linux application Makefile sample
# make -- the optical output without debug info
# make DEBUG=1 -- debug info include
# make clean -- clean the object file(s)
# make install -- install the execute file(s) to INSTALLDIR
#---------------------------------------------------------------
# History :
# Program start, Embest R.X.Huang 2005.6.5
LINUXDIR = /usr/local/src/edukit-2410/kernel
CROSSDIR = /usr
INSTALLDIR = /home/app
CROSSDIR = /usr
INSTALLDIR = /home/app
#--------------------------------- /* execute file(s) */
TESTFILE = server
#--------------------------------- /* object file(s) */
SRCFILE = server.c
#--------------------------------- /* header file(s) */
TESTFILE_H =
TESTFILE = server
#--------------------------------- /* object file(s) */
SRCFILE = server.c
#--------------------------------- /* header file(s) */
TESTFILE_H =
H_EXEC = client.exe
H_SRC = client.c
H_SRC = client.c
HOST_CC = gcc
CROSS=arm-linux-
CC = $(CROSS)gcc
AS = $(CROSS)as
LD = $(CROSS)ld
CROSS=arm-linux-
CC = $(CROSS)gcc
AS = $(CROSS)as
LD = $(CROSS)ld
ifdef DEBUG
CFLAGS = -g
else
CFLAGS = -O2 -fomit-frame-pointer
endif
CFLAGS = -g
else
CFLAGS = -O2 -fomit-frame-pointer
endif
CFLAGS += -mapcs-32 -march=armv4 -mtune=arm9tdmi -fno-builtin
INCLUDES = -I$(LINUXDIR)/include /
-I$(CROSSDIR)/arm-linux/include /
-I$(CROSSDIR)/lib/gcc-lib/arm-linux/2.95.3/include
CFLAGS +=$(INCLUDES)
-I$(CROSSDIR)/arm-linux/include /
-I$(CROSSDIR)/lib/gcc-lib/arm-linux/2.95.3/include
CFLAGS +=$(INCLUDES)
CRYPT = $(CROSSDIR)/arm-linux/lib/crt1.o /
$(CROSSDIR)/arm-linux/lib/crti.o /
$(CROSSDIR)/arm-linux/lib/crtn.o
$(CROSSDIR)/arm-linux/lib/crti.o /
$(CROSSDIR)/arm-linux/lib/crtn.o
LIBDIR = -L$(CROSSDIR)/arm-linux/lib/ /
-L$(CROSSDIR)/lib/gcc-lib/arm-linux/2.95.3
-L$(CROSSDIR)/lib/gcc-lib/arm-linux/2.95.3
LDFLAGS += $(LIBDIR) -nostartfiles -static
all: $(TESTFILE)
$(TESTFILE): $(SRCFILE) $(TESTFILE_H) Makefile
$(CC) $(CFLAGS) -o $@ $@.c
$(HOST_CC) -o $(H_EXEC) $(H_SRC)
$(CC) $(CFLAGS) -o $@ $@.c
$(HOST_CC) -o $(H_EXEC) $(H_SRC)
client:
$(HOST_CC) -o $(H_EXEC) $(H_SRC)
$(HOST_CC) -o $(H_EXEC) $(H_SRC)
clean:
rm -f $(TESTFILE) $(H_EXEC)
install: $(TESTFILE)
mkdir -p $(INSTALLDIR)
cp --target-dir=$(INSTALLDIR) $(TESTFILE) $(H_EXEC)
rm -f $(TESTFILE) $(H_EXEC)
install: $(TESTFILE)
mkdir -p $(INSTALLDIR)
cp --target-dir=$(INSTALLDIR) $(TESTFILE) $(H_EXEC)
编译运行后,将生成的
Client.exe
在
Cywin
中运行,将二进制文件
Server
下载到目标板上并在其
linux
环境中运行,即可实现
linux
环境下的
udp
通讯。
2 Windows
环境下,
UDP
通讯
/*********************************************************************
文件:Server.cpp
作者:Sayigood
时间:2008/5/8
说明:1、server端: open a socket(socket)--->name the socket(bind)---> send
and receive data(sendto recvfrom)--->close socket(closesocket)
2、需要引入lib:
project/settings/link/object/library modules(对象/库模块):加上ws2_32.lib
*********************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include "init.h"
void main()
{
SOCKET socket1;
InitWinsock();
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET; //地址族,常被赋为AF_INET
local.sin_port=htons(4000); //监听端口
local.sin_addr.s_addr=INADDR_ANY; //本机
socket1=socket(AF_INET,SOCK_DGRAM,0); //数据报套接字
bind(socket1,(struct sockaddr*)&local,sizeof local); //绑定套接字到一个IP地址和一个端口
while (1)
{
char buffer[1024]="/0";
printf("Waiting for message from others:/n");
//接受并回发信息
if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR){
printf("Received datagram from %s--%s/n",inet_ntoa(from.sin_addr),buffer);
sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);
}
Sleep(500);
}//end while
closesocket(socket1);
}
/*********************************************************************
文件:Client.cpp
作者:Sayigood
时间:2008/5/8
说明:1、client端:open a socket(socket)--->send and receive data(sendto recvfrom)
--->close socket(closesocket)
2、需要引入lib:
project/settings/link/object/library modules(对象/库模块):加上ws2_32.lib
*********************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include "init.h"
void main()
{
SOCKET socket1;
InitWinsock();
struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET; //地址族,常被赋为AF_INET
server.sin_port=htons(4000); //server的监听端口
server.sin_addr.s_addr=inet_addr("192.192.192.190"); //server的地址
socket1=socket(AF_INET,SOCK_DGRAM,0); //数据报套接字
while (1)
{
char buffer[1024]="/0";
printf("input message/n");
scanf("%s",buffer);
if (strcmp(buffer,"bye")==0)
break;
//发送并接受信息
if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR){
if(recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,&len) != SOCKET_ERROR)
printf("rece from server:%s/n",buffer);
}
}//end while
closesocket(socket1);
}
这个就不用说怎么运行了吧,很简单!
现在我们有了一个试验箱(Linux)上面的一个UDP通讯程序,又有了一个Windows环境下的UDP通讯程序,接下来就是如何在实验箱与windows间通讯了。
其实,很简单,只要把前面1中的Linux环境下运行的二进制文件Server下载到箱子上,然后运行2 中的客户端即可实现通讯。
想一想这也是合乎情理的,因为不同系统、不同变成环境对于
TCP/IP
协议的实现,不没有违背协议,所以传送的报文是可以互读的。