网络编程之UDP服务器

来源:互联网 发布:中科院研究员待遇知乎 编辑:程序博客网 时间:2024/05/02 01:11

UDP服务器:

1、创建套接字

函数:

SOCKET socket(  int af,        //指定地址族,它只能是AF_INET或PF_INET   int type,      //socket类型,两种类型:SOCK_STREAM(流式套接字); SOCK_DGRAM(数据报套接字).这里选择SOCK_DGRAM    int protocol   //指定为0);
eg:
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

 

2、绑定套接字

函数:

int bind(  SOCKET s,       //要绑定的套接字,这里是上面我们创建的套接字                      const struct sockaddr FAR *name,  //该套接字的本地地址信息,一个指向sockaddr结构的指针变量。(下面相关函数中介绍)   int namelen     //该地址结构的长度,用sizeof操作符计算。sizeof(SOCKADDR);                    );

相关函数:(在基于TCP/IP的socket编程中,用sockaddr_in代替sockaddr)

struct sockaddr_in { short sin_family; //地址族,必须设置为AF_INET u_short sin_port; //端口号 struct in_addr sin_addr; //套接字的主机IP地址 char sin_zero[8];  //填充数,以使sockaddr_in和sockaddr结构长度一样,一般我们不设置值。};
eg:
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port.S_un.S_addr = htonl(INADDR_ANY);

addrSrv.sin_port = htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 

3、等待接收数据

函数:

int recvfrom(  SOCKET s,  //套接字                   char FAR* buf,   //缓冲区,用来保存接收的数据             int len,         //缓冲区的大小              int flags,       //设置函数调用行为,这里设置为0             struct sockaddr FAR *from, //指向地址结构体的指针,主要用来接收发送数据方的地址信息   int FAR *fromlen //地址结构的大小,在调用前必须赋初值           );
eg:
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvbuf[100];
recvfrom(sockSrv,recvbuf,100,0,(SOCKADDR*)&addrClient,&len);

 

4、关闭套接字

函数:

int closesocket(  SOCKET s  //关闭套接字  );
eg:
closesocket(sockSrv);
WSACleanup();

 

整体程序:

#include <stdio.h>
#include <Winsock2.h>

void main()
{
 ///initialize socket
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 2, 2 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
 {
  return;
 }
 
 if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 )
 {
  WSACleanup( );
  return;
 }

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

 ///bind socket
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr = INADDR_ANY;
 addrSrv.sin_family = AF_INET;
 addrSrv.sin_port = htons(6000);
 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 ////recv data
 char recvbuf[100];
 SOCKADDR_IN addrClient;
 int len = sizeof(SOCKADDR);
 recvfrom(sockSrv,recvbuf,100,0,(SOCKADDR*)&addrClient,&len);
 printf("%s\n",recvbuf);

 closesocket(sockSrv);
 WSACleanup();
}

 

原创粉丝点击