UDP和Socket通信步骤
这是在网上找到的,希望对你有所帮助。
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);
WINDOWS环境下TCP/UDP编程步骤:
1 基于TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32lib的库文件。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
服务器端代码如下:
#include <stdioh>
#include <Winsock2h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaDatawVersion ) != 1 ||
HIBYTE( wsaDatawVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr=htonl(INADDR_ANY);
addrSrvsin_family=AF_INET;
addrSrvsin_port=htons(6000);
bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR)&addrClient,&len);
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClientsin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端的代码如下:
#include <stdioh>
#include <Winsock2h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaDatawVersion ) != 1 ||
HIBYTE( wsaDatawVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr=inet_addr("127001");
addrSrvsin_family=AF_INET;
addrSrvsin_port=htons(6000);
connect(sockClient,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("%s\n",recvBuf);
send(sockClient,"hello",strlen("hello")+1,0);
closesocket(sockClient);
WSACleanup();
}
2基于UDP的socket编程是采用的数据报套接字。
在这个程序中,将两个工程添加到一个工作区。同时还要链接一个ws2_32lib的库文件。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:等待和接收数据(sendto()/recvfrom());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
服务器端代码如下:
#include <winsock2h>
#include <stdioh>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaDatawVersion ) != 1 ||
HIBYTE( wsaDatawVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr=htonl(INADDR_ANY);
addrSrvsin_family=AF_INET;
addrSrvsin_port=htons(7003);
bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
对于基于UDP的socket客户端来说,要进行如下步骤:
1:创建一个套接字(socket);
2:向服务器发送数据(sendto);
3:关闭套接字;
代码如下:
#include <winsock2h>
#include <stdioh>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaDatawVersion ) != 2 ||
HIBYTE( wsaDatawVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClientsin_addrS_unS_addr=inet_addr("127001");
addrClientsin_family=AF_INET;
addrClientsin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,"hi",3,0,(SOCKADDR)&addrClient,sizeof(SOCKADDR));
}
LINUX环境下TCP/UDP编程步骤:
TCP编程步骤:
一 服务端:
1socket(int domain,int type,int protocol):建立套接字;
2 bind(int sockid,struct sockaddr addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;
3listen(int sockid,int qsize):监听某套接字;
4fd=accept(int sockid,struct sockaddr callerid,socklen_t addrlenp):等待某套接字接收信息;
5recv(int fd,void buf,size_t nbytes,int flags):从套接字接收数据;
6close(fd) 和close(sockid)
二客户端:
1 socket():建立套接字;
2connect(int sockid,struct sockaddr serv_addrp,socklen_t addrlen):连接到服务器;
3 send(int sockfd,const void buf,size_t nbytes,int flags):发送数据到服务器
4 close(sockid);
UDP编程步骤:
一,服务端:
1 socket():同上;
2 bind():同上;
3 recvfrom(int sockfd,voidbuff,size_t nbytes,int flags,struct sockaddrfrom,socklen_taddrlen):在套接字口接收数据,并且记录下接收到的数据来源;一定要注意这里的参数addrlen,它不仅是函数的输出,也是函数的输入!所以要在调用该函数之前对addrlen赋值sizeof(struct sockaddr)。否则返回的地址from将会出错!
4 close(sockfd);
二 客户端:
1 socket();同上;
2 sendto(int sockfd,const voidbuff,size_t nbytes,int flags,const struct sockaddrto,socklen_t addrlen):往指定的地址发送数据;
3 close(sockfd);
1客户端连接到代理服务器开放的端口;
2客户端向代理服务器发送验证申请;
3代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5代理服务器开始进行到目的主机的真正连接;
6代理服务器为客户端开放一个新的端口并向客户端发送一个数据包告知客户端这个新的端口;
7客户端创建一个新的套接字并连接到代理服务器的新的端口;
8然后,代理服务器把由新端口接收到的数据都转发给目的主机,把从目的主机发过来的数据都由新端口转发给客户端。
0条评论