网络编程之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();
}
- 网络编程之UDP服务器
- 网络编程之udp
- 网络编程之UDP
- 网络编程之UDP
- 网络编程之udp
- 网络编程之 UDP
- UDP网络编程服务器部分
- 网络编程之UDP编程
- java网络编程之UDP
- java网络编程之UDP
- 网络编程之UDP客户端
- unix网络编程之udp
- java网络编程之UDP
- linux之UDP网络编程
- QT 网络编程之udp
- 网络编程之UDP协议
- Linux 网络编程之UDP
- Android网络编程之UDP
- 正向代理和反向代理
- linux操作系统编程——用exec函数族实现shell功能
- QT的信号和信号槽
- C# 3.0 拓展方法
- 当 Shell 遇见 Emacs -- 大话 Emacs Shell Mode(3)
- 网络编程之UDP服务器
- HDOJ 1106
- POJ 2398 Toy Storage (判断点与线段关系)
- 数据库驱动文件
- 8812刷机
- 仿射变换
- VC贴图函数
- A knight's journey
- SPIN (P2316)