基于UDP协议的网络程序设计

 

l  实例编译环境为Microsoft Visual Studio 2010

l  该实例编写了一个基于数据包的客户端/服务器交互程序,在程序启动后,服务器端向客户发送“Hello!I am a server.”信息,客户端向服务器端发送“Hello!I am a client.”信息,双方各自接收到对方的信息将其显示出来。

l  实例执行结果:

1和图2分别是客户端程序和服务器端程序执行结果,它们是在同一台主机上执行的结果。该主机的IP地址设置为“58.154.232.29”。客户端程序共执行3次,每执行一次服务器端程序就显示与其建立连接的客户端IP地址和端口号,并显示发送的给客户端的字节数。(每次执行时,主机都分配了不同的端口号)

基于UDP协议的网络程序设计 - 梦幻骑士 - 梦幻骑士

 

1 服务器端程序执行结果

基于UDP协议的网络程序设计 - 梦幻骑士 - 梦幻骑士

 

2 客户端程序执行结果

l  具体的Server.cclient.c程序源代码

//****************************Server.c**********************************//

#include <windows.h>

#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")//¨?vs2010D?¨?¨???a

#include <stdio.h>

#include <string.h>

#define PROTOPORT       5050 

#define BUFFER_LENGTH   1024

#define QLEN            6             

 

//int     visits      =   0;            

 

int main(int argc, char *argv[]){

 

    int     port=PROTOPORT;      //-°¨??¨?

 

    WSADATA wsaData;

    SOCKET  sSocket;

    struct  hostent  *ptrh;     

    struct  protoent *ptrp;    

    struct  sockaddr_in sad;//?????? 

    struct  sockaddr_in cad;//¨????

 

    int     iLen;         //¨???¨¨

    int     iRecv;      //¨????yY¨¨

    int     iSend;   //¤?é¨????yY¨¨

    char    buf[1024];

    char    send_buf[]="Hello!I am a server.";//¤?é¨??¨????

    char    recv_buf[BUFFER_LENGTH];//¨????yY??o??

    printf("Server waiting ...\n");

 

    WSAStartup(0x0101, &wsaData);//?¨?°??

 

    memset(recv_buf,0,sizeof(recv_buf));

    memset((char *)&sad,0,sizeof(sad)); //?ysocket¨?1

 

    if ( ((int)(ptrp = getprotobyname("udp"))) == 0) {

       fprintf(stderr, "cannot map \"udp\" to protocol number");

       exit(1);

    }

    /* Create a socket */

    sSocket = socket(AF_INET, SOCK_DGRAM, ptrp->p_proto);

    if (sSocket < 0) {

       fprintf(stderr, "socket creation failed\n");

       exit(1);

    }

    //??é¤t??????

    sad.sin_family = AF_INET; //?¨¨? 

 

    if (argc > 1) {                

       port = atoi(argv[1]);  

    } else {

       port = PROTOPORT;     

    }

    if (port > 0){                  

       sad.sin_port = htons((u_short)port);//??°?????¨?????¨???¨?3¨°?y?a?a?????¨?3

    }

    else{                 

       fprintf(stderr,"bad port number %s\n",argv[1]);

       exit(1);

    }  

    sad.sin_addr.s_addr = htonl(INADDR_ANY);//?¨¨??????IP??

    if (bind(sSocket, (LPSOCKADDR)&sad, sizeof(sad)) < 0) {

       fprintf(stderr,"bind failed\n");

       exit(1);

    }

    //?????¨???o??

    iLen = sizeof(cad);

 

    //?D?yY¨???¨?¤?é¨?

    while (1) {

 

       iRecv=recvfrom(sSocket, recv_buf,BUFFER_LENGTH,0,(struct sockaddr *)&cad,&iLen);

       if ( iRecv< 0)

       {

           fprintf(stderr, "accept failed\n");

           exit(1);

       }

       //???¨??¨????

       printf("recvfrom() :%s\n",recv_buf);

       //?¨?¤?é?

       iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(struct sockaddr *)&cad,sizeof(cad));

       if (iSend<0)

       {

           fprintf(stderr, "Sendto failed\n");

           exit(1);

       }else

           printf("send() succeeded.\n");

 

    }

    closesocket(sSocket);

    WSACleanup();

}

//***********************client.c**********************************//

#include <windows.h>

#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")

#include <io.h>

 

#include <stdio.h>

#include <string.h>

#define PROTOPORT       5050                      

#define DATA_BUFFER     1024

         

int main(int argc, char *argv[]){

 

    WSADATA wsaData;

    SOCKET    sClient;    

    struct  sockaddr_in sad;  //¤t??????

 

    int     port=5050;      //-°¨??¨?               

    int     iLen;         //¤t?????¨¨           

 

    int     iSend;   //¤?é¨??yY??¨¨

    int      iRecv;  //¨????yY??¨¨

    char    send_buf[]="Helloê?I am a client!";//¤?é¨??¨????

    char    recv_buf[5000];//¨????yY??o??

 

    WSAStartup(0x0101, &wsaData);//?¨?°??

 

    //?????¨???o??

    memset(recv_buf,0,sizeof(recv_buf));

    memset((char *)&sad,0,sizeof(sad)); 

 

    //??é¤t??????

    sad.sin_family = AF_INET; //?¨¨? 

    sad.sin_addr.s_addr = inet_addr(argv[1]);//?¨¨??????IP??               

  sad.sin_port = htons((u_short)port);//??°?????¨?????¨???¨?3¨°?y?a?a?????¨?3¨°

 

    /* Create a socket */

    sClient = socket(AF_INET, SOCK_DGRAM, 0);

    if (sClient < 0) {

       fprintf(stderr, "socket creation failed\n");

       exit(1);

    }

 

    iLen = sizeof(sad); 

    //?¤t????¤?é?

    iSend=sendto(sClient,send_buf,sizeof(send_buf),0,(struct sockaddr *)&sad,iLen);

    if (iSend<0)

    {

       fprintf(stderr, "Sendto failed\n");

       exit(1);

    }else

       printf("send() succeeded.\n\n");

 

    //?¨?¤t???¨????

       iRecv=recvfrom(sClient, recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&sad,&iLen);

       if ( iRecv< 0)

       {

           fprintf(stderr, "accept failed\n");

           exit(1);

       }

 

           printf("recvfrom():%s\n",recv_buf);

    closesocket(sClient);

    WSACleanup();

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值