linux socket udp docker代理

UDP和Socket通信步骤

这是在网上找到的,希望对你有所帮助。

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

WINDOWS环境下TCP/UDP编程步骤:

1.基于TCP的socket编程是采用的流式套接字。

在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include<stdio.h>

#include<Winsock2.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0){

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1){

WSACleanup();

return;

}

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

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_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(addrClient.sin_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<stdio.h>

#include<Winsock2.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0){

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1){

WSACleanup();

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_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_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:等待和接收数据(sendto()/recvfrom());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include<winsock2.h>

#include<stdio.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0)

{

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1)

{

WSACleanup();

return;

}

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

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_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<winsock2.h>

#include<stdio.h>

void main()

{

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;

}

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

SOCKADDR_IN addrClient;

addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrClient.sin_family=AF_INET;

addrClient.sin_port=htons(8889);

SOCKADDR_IN addrSrv;

sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

}

LINUX环境下TCP/UDP编程步骤:

TCP编程步骤:

一.服务端:

1.socket(int domain,int type,int protocol):建立套接字;

2.bind(int sockid,struct sockaddr*addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;

3.listen(int sockid,int qsize):监听某套接字;

4.fd=accept(int sockid,struct sockaddr*callerid,socklen_t*addrlenp):等待某套接字接收信息;

5.recv(int fd,void*buf,size_t nbytes,int flags):从套接字接收数据;

6.close(fd)和close(sockid)

二.客户端:

1. socket():建立套接字;

2.connect(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,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收数据,并且记录下接收到的数据来源;一定要注意这里的参数addrlen,它不仅是函数的输出,也是函数的输入!所以要在调用该函数之前对addrlen赋值sizeof(struct sockaddr)。否则返回的地址from将会出错!

4. close(sockfd);

二.客户端:

1. socket();同上;

2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址发送数据;

3. close(sockfd);

Linux C/C++ UDP socket通信

Linux C/C++进行UDP socket通信时,其Server端与Client端的主要流程各有不同。Server端流程包括初始化socket,绑定端口与地址,接收数据并处理后,发送回应至客户端。而Client端则需要创建socket,获取Server地址与端口信息,接着发送请求数据,接收Server回应。

在进行UDP通信时,需用到四个关键API,分别是socket(),bind(),sendto()与recvfrom()。掌握这四个函数,便能熟练地利用UDP进行各种数据传输。

在UDP通信中,地址与端口的配置是通过sockaddr_in结构体来完成的。该结构体包括了IP地址、端口号、网络字节序等信息,便于程序准确地设置与识别通信目标。

具体来说,消息的发送与接收主要通过sendto()与recvfrom()函数来完成。sendto()函数用于发送数据包至指定目标,而recvfrom()则用于接收从任意地址发送来的数据包。这两个函数的使用,使得UDP通信在灵活性与效率上都有了显著提升。

为了验证上述流程与函数的正确性,通常会编写测试程序。Server端程序会监听特定端口,接收客户端发送的数据,并进行处理后将回应发回。同时,Client端程序则会尝试连接Server端并发送测试数据,接收Server的回应,以此测试通信的稳定性和数据传输的正确性。

实现稳定的LinuxUDP通信linuxudp通信

UDP是一种不可靠的网络协议,它比TCP协议具有更简单和轻便的传输特性。Linux操作系统之间如果要通信,要实现稳定的UDP通信,需要完成一系列的工作。下文将详细介绍Linux UDP通信的实现过程。

首先,在Linux主机服务器上装载UDP数据包,它有两个重要步骤:

(1)安装和配置Linux UDP服务器驱动程序,

$sudo apt-get install linux-udp-server-driver

$sudo modprobe udp_sock

$sudo insmod udp_sock.ko

(2)配置UDP监听端口(如常用的UDP端口8080),

$sudo netstat-anp| grep 8080

接着,在客户端上装载UDP服务器的回复报文,以实现对报文的处理,主要包括:

(1)客户端创建一个UDP套接字,

//创建一个UDP套接字

$socket= socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

(2)客户端配置UDP端口(如8080)并绑定套接字,

//绑定端口

$bind= socket_bind($socket, INADDR_ANY, 8080);

//监视端口

$listen= socket_listen($socket);

最后,客户端循环接收UDP报文,并作相应处理,如回显或发送请求等:

//接受UDP报文

socket_recvfrom($socket,$buffer,1024,0,$from,$port);

//回显

socket_sendto($socket,$buffer,1024,0,$from,$port);

//关闭Socket

socket_close($socket);

以上就是实现Linux UDP通信的全部步骤,可以编写脚本实现自动化的操作,从而保证Linux UDP通信的稳定性。

阅读剩余
THE END