UDP之socket编程实例

不讲解了,要求读者:
1. 知道UDP是什么
2. 索求Windows环境下的socket编程函数
3. 已经配置好了编译环境——在Tools-option-中的设置

客户端代码

#include <stdio.h>
#include <winsock2.h>
#include <iostream> 
#pragma comment(lib, "ws2_32.lib") 
using namespace std;

bool BindSocket(SOCKET& socket,short port ,const char* Ip){
    sockaddr_in address;
    address.sin_family=AF_INET;
    address.sin_addr.s_addr =inet_addr(Ip);
    address.sin_port=htons(port);
    if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ){
        return false;
    } 
    return true;
}

int main()
{
    WORD wVersionRequested;
    WSADATA wData;
    int err;
    int port;               //客户端端口号 
    int Otherport;          //服务器端口号 
    char IPaddr[18];        //客户端Ip 
    char OtherIP[18];       //服务器Ip 
    wVersionRequested = MAKEWORD( 1, 1 );   // 请求WinSock库
    err = WSAStartup( wVersionRequested, &wData );
    if(err!=0)  {return -1;}                // 返回值为零时表示成功WSAStartup

    SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);        //创建Socket 
    if(sockCli < 0){
        cout << "socket creation failed" << endl;
        return 0; 
    } 
    cout << "socket created" << endl;

    cout << "请输入本机IP:" << endl;     //输入客户端IP和端口号 
    gets(IPaddr);
    printf("请输入本机端口号:\n");
    cin >> port;

    if(!BindSocket(sockCli,port,IPaddr)){   //将本地IP地址和端口号绑定到所创建的套接字上
        cout << "Bind failed" << endl;
        return 0; 
    } 
    cout << "Bind Socket success " << endl;

    sockaddr_in address;                //服务器的IP和端口号 
    cout << "请输入服务器的IP" << endl;
    cin >> OtherIP;
    cout << "请输入服务器的端口号"  << endl;
    cin >> Otherport;
    address.sin_family=AF_INET;
    address.sin_addr.s_addr=inet_addr(OtherIP); 
    address.sin_port=htons(Otherport);


    char talk[100]="t"; 
    for(int i=0;i<100;i++){         //发送100个数据包 
        sendto(sockCli,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) );
    }


    closesocket(sockCli); 
    WSACleanup(); 

    return 0; 
}

服务器代码:

#include <stdio.h>
#include <iostream>
// c++ include lib from windows
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") 
using namespace std;

bool BindSocket(SOCKET& socket,short port ,const char* Ip){
    sockaddr_in address;
    // set address of socket from socket family AF_INET;
    address.sin_family=AF_INET;
    address.sin_addr.s_addr =inet_addr(Ip);// set machine IP; 
    address.sin_port=htons(port);   // set machine port
    // all above belong to net words;
    if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) ){
        return false;
    } 
    return true;
}

int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    int port;           //服务器端口号 
    char IPaddr[18];    //服务器Ip 
    sockaddr_in address;
    int n=sizeof(struct sockaddr);
    char talk[100]={0};
    char buffer[100] = {0};
    wVersionRequested = MAKEWORD( 1, 1 );   // 请求WinSock库  
    err = WSAStartup( wVersionRequested, &wsaData );
    if(err!=0)  {return -1;} 

    SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);        //创建Socket 
    /* Something about socket return value. */
    if(sockSrv < 0){
        cout << "socket creation failed" << endl;
        return 0;
    }
    cout << "socket created" << endl;

    cout << "请输入本机IP:" << endl;
    cin >> IPaddr;
    printf("请输入本机端口号:\n");
    cin >> port;
    //cout << IPaddr << endl << port << endl;
    while(! BindSocket(sockSrv,port,IPaddr)){       //将本地IP地址和端口号绑定到所创建的套接字上 
        cout << "Bind fail" << endl;
        cout << "请输入本机IP:" << endl;
        cin >> IPaddr;
        printf("请输入本机端口号:\n");
        cin >> port;
    }
    cout << "Bind Socket success " << endl;

    /*这里不知道对不对*/ 


    int num =0;
    // over-time setting, and ACKpp setting;
    // more about recvfrom function;
    while(1){           //接受来自客户端的数据包 
        if(recvfrom(sockSrv,buffer, 100,0,(struct sockaddr*)&address,&n) == SOCKET_ERROR ) {
            cout << "接收失败"  << endl; 
        }
        else{
                num++;
        }
        cout << num << endl;// output situation;
    }

    closesocket(sockSrv); 
    WSACleanup(); 
    return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值