Windows下的UDP Socket编程
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;
}