Windows下的UDP Socket编程

2025-09-26 22:24:53

1、首先在电脑上安装好VC++6.0。这个网上已经有很多教程了,本文就不多做介绍了。

2、了解一下网络知识,TCP,UDP以及SOCKET是什么。其实socket就是一个五元组,网络协议,本地端口,本地IP,远地端口,远地IP。socket编程主要是把数据发送到一个本地的缓冲区,而从本地传输到远地的计算机这个过程则无需我们管。

3、接着,你要了解一下socket函数库里的一些函数和结构体。随便找一本网络编程的书,里面基本都有关于socket库的介绍,描述。下面举几个本文编程会用到的

int sendto ( socket s , const void * msg, int len, unsigned int flags, const

struct sockaddr * to , int tolen ) ;  //发送

int recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);   //接收

SOCKET  socket( int af, int type, int protocol);    //初始化SOCKET

 closesocket(); //关闭SOCKET

4、最后贴出程序,其实程序很简单,懂了网络协议,以及SOCKET,基本都能看懂这个程序,如果有哪些函数不懂,可以百度一下。

client.cpp

#include <WINSOCK2.H>  

#include <iostream>  

#include <string>  

using namespace std;  

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

bool Socketbind(SOCKET& socket,short port ,const char* Ip);   

int main()  

{  

WORD wVersionRequested;  

    WSADATA wData;    // 这结构是用于接收Wjndows Socket的结构信息的  

    int err;  

int port,Otherport;

char IPaddr[18];

char OtherIP[18];

       

    wVersionRequested = MAKEWORD( 1, 1 );   // 请求WinSock库  

       

    err = WSAStartup( wVersionRequested, &wData );  

    if ( err != 0 ) {  

        return -1;          // 返回值为零时表示成功WSAStartup  

    } 

      

    SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockCli<0)

{

printf("failed");

return 0;

}

printf("NEWSocket success.\n");  

    printf("请输入本机IP地址:\n");

gets(IPaddr);

printf("请输入本机端口号:\n");

scanf("%d",&port);

if(! BindSocket(sockCli,port,IPaddr) )  

    {

printf("failed");

return 0;

    printf("BindSocket success.\n");   

    SOCKADDR_IN address;  

     

    

printf("请输入远机IP地址:\n");

scanf("%s",OtherIP);

printf("请输入远机端口号:\n");

scanf("%d",&Otherport);

    address.sin_family=AF_INET;   

    address.sin_addr.s_addr=inet_addr(OtherIP);  

    address.sin_port=htons(Otherport);  

    char talk[100]={0};

gets(talk);

SOCKADDR_IN addre;  

int n=sizeof(struct sockaddr); 

    char buffer[100] = "ghfd";

while(talk[0]!='f')

{

printf("please talk:\n");

gets(talk);

    if( sendto(sockCli,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) ) ==SOCKET_ERROR )  

           printf("发送失败\n");    

        recvfrom(sockCli,buffer,100,0,(struct sockaddr*)&addre,&n);

puts(buffer);

}

    closesocket(sockCli); 

    WSACleanup(); 

}   

  

bool Socketbind(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;  

}  

5、server.cpp

#include <WINSOCK2.H>  

#include <string>  

using namespace std;  

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

  

bool BindSocket(SOCKET& socket,short port ,const char* sIp);  

   

int main()  

{  

WORD wVersionRequested;  

    WSADATA wData;    // 这结构是用于接收Wjndows Socket的结构信息的  

    int err;  

int port;

char IPaddr[18];

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;          // 返回值为零时表示成功WSAStartup  

    }  

    SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockSrv<0)

{

printf("failed");

return 0;

}

printf("NEWSocket success.\n");  

    printf("请输入本机IP地址:\n");

gets(IPaddr);

printf("请输入本机端口号:\n");

scanf("%d",&port);

gets(buffer);    //去掉回车

while(! BindSocket(sockSrv,port,IPaddr) )  

    {

printf("failed");

printf("请输入本机端口号:\n");

scanf("%d",&port);

    printf("BindSocket success.\n");   

while(buffer[0]!='f')

{

    if(recvfrom(sockSrv,buffer, 100,0,(struct sockaddr*)&address,&n) ==SOCKET_ERROR )  

        printf("接收失败\n"); 

    else

{

puts(buffer);

printf("please talk:\n");

   gets(talk);

sendto(sockSrv,talk, sizeof(talk), 0,(const struct sockaddr*)&address,sizeof(struct sockaddr) );

}

}

    closesocket(sockSrv); 

    WSACleanup(); 

}    

  

bool Socketbind(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);  

    memset(address.sin_zero,0,sizeof(address.sin_zero));  

      

    if(SOCKET_ERROR == bind(socket,(const struct sockaddr*)&address,sizeof(struct sockaddr)) )  

    {  

        return false;  

    }  

      

    return true;  

}  

   

  

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢