UDP通讯(vc与c通讯)

本文详细介绍了如何在Linux和Windows环境下实现UDP通信。通过提供Server和Client端的C/C++代码示例,展示了如何使用socket API进行数据报套接字的创建、绑定、接收和发送数据。同时,给出了编译和运行这些程序的步骤,以帮助读者理解跨平台UDP通信的工作原理。
摘要由CSDN通过智能技术生成
 
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>
int main(int argc, char *argv[])
{
int sock;
//sendto
中使用的对方地址
struct sockaddr_in toAddr;
//
recvfrom 中使用的对方主机地址
struct sockaddr_in fromAddr;
int recvLen;
unsigned int addrLen;
char recvBuffer[1024]="/0";
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock < 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);
if(bind(sock,(struct sockaddr*)&fromAddr,sizeof(fromAddr))<0)
{
 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;
}
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>
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;
unsigned int fromLen;
char recvBuffer[1024]="/0";
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock < 0)
{
 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);
}
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;
}
用的 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
LINUXDIR = /usr/local/src/edukit-2410/kernel
CROSSDIR = /usr
INSTALLDIR = /home/app
#--------------------------------- /* execute file(s) */
TESTFILE  = server
#--------------------------------- /* object file(s) */
SRCFILE  = server.c
#--------------------------------- /* header file(s) */
TESTFILE_H =
H_EXEC = client.exe
H_SRC = client.c
HOST_CC = gcc
CROSS=arm-linux-
CC = $(CROSS)gcc
AS = $(CROSS)as
LD = $(CROSS)ld
ifdef DEBUG
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)
CRYPT    =  $(CROSSDIR)/arm-linux/lib/crt1.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
LDFLAGS += $(LIBDIR) -nostartfiles -static
all:   $(TESTFILE)
$(TESTFILE):  $(SRCFILE) $(TESTFILE_H) Makefile
 $(CC) $(CFLAGS) -o $@ $@.c
 $(HOST_CC) -o $(H_EXEC) $(H_SRC) 
client:
 $(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)
        编译运行后,将生成的 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 协议的实现,不没有违背协议,所以传送的报文是可以互读的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值