UDP和Socket通信步骤是什么?
UDP Server程序 1、编写UDP Server程序的步骤(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:struct sockaddr_in {uint8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero[8];};这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。2、udpserv.c程序内容:#include #include #include #include #include #include #define MAXLINE 80#define SERV_PORT 8888void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen){int n;socklen_t len;char mesg[MAXLINE];for(;;){len = clilen;/* waiting for receive data */n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);/* sent data back to client */sendto(sockfd, mesg, n, 0, pcliaddr, len);}}int main(void){int sockfd;struct sockaddr_in servaddr, cliaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket *//* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);/* bind address and port to socket */if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){perror("bind error");exit(1);}do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));return 0;}UDP Client程序1、编写UDP Client程序的步骤(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。(6)处理接收到的数据,这里是直接输出到标准输出上。2、udpclient.c程序内容:#include #include #include #include #include #include #include #include #define MAXLINE 80#define SERV_PORT 8888void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen){int n;char sendline[MAXLINE], recvline[MAXLINE + 1];/* connect to server */if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1){perror("connect error");exit(1);}while(fgets(sendline, MAXLINE, fp) != NULL){/* read a line and send to server */write(sockfd, sendline, strlen(sendline));/* receive data from server */n = read(sockfd, recvline, MAXLINE);if(n == -1){perror("read error");exit(1);}recvline[n] = 0; /* terminate string */fputs(recvline, stdout);}}int main(int argc, char **argv){int sockfd;struct sockaddr_in srvaddr;/* check args */if(argc != 2){printf("usage: udpclient n");exit(1);}/* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("[%s] is not a valid IPaddressn", argv[1]);exit(1);}sockfd = socket(AF_INET, SOCK_DGRAM, 0);do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));return 0;}运行例子程序1、编译例子程序使用如下命令来编译例子程序:gcc -Wall -o udpserv udpserv.cgcc -Wall -o udpclient udpclient.c编译完成生成了udpserv和udpclient两个可执行程序。2、运行UDP Server程序执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:* LISTENudp 0 0 0.0.0.0:32768 0.0.0.0:*udp 0 0 0.0.0.0:8888 0.0.0.0:*udp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:882 0.0.0.0:*可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。如果这时再执行./udpserv &命令,就会看到如下信息:bind error: Address already in use说明已经有一个服务程序在运行了。3、运行UDP Client程序执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:Hello, World!Hello, World!this is a testthis is a test^d输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。如果服务程序没有启动,而执行客户程序,就会看到如下信息:$ ./udpclient 127.0.0.1testread error: Connection refused 说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。

udp socket传输有延时吗
有的, 一般是根据路由器的转发次数估测时延。北京到华盛顿和北京到上海,时延差距很大,这是因为转发次数太多的缘故。
任何传输都是有网络上的时间消耗的。。 内核处理,调度消耗的时间。路上消耗的时间:距离/光速。内网的延迟大约 1ms 距离时间要看网络环境

udp socket 关于在一个程序里实现发送和接收
发送程序Sender.cpp: #include#include#include#includeusing namespace std;//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")struct test {string str;};struct UdpHeartPack {char UDPData[16] ;};int main(int argc, char* argv[]){struct UdpHeartPack udpPack;static int UDP_PORT = 7001;udpPack.UDPData[0] = 'h';udpPack.UDPData[1] = 'e';udpPack.UDPData[2] = 'l';udpPack.UDPData[3] = 'l';udpPack.UDPData[4] = 'o';udpPack.UDPData[5] = ' ';udpPack.UDPData[6] = 'w';udpPack.UDPData[7] = 'o';udpPack.UDPData[8] = 'r';udpPack.UDPData[9] = 'l';udpPack.UDPData[10] = 'd';udpPack.UDPData[11] = ' ';char *pPack = (char *) &udpPackWSADATA wsaData;//指向WinSocket信息结构的指针SOCKET sockListener;//创建套接字SOCKADDR_IN saUdpServ;//指向通信对象的结构体指针BOOL fBroadcast = TRUE; //用于setsockopt(),表示允许char sendBuff[800]; //缓冲区存放发送的数据int ncount=0; //用于显示消息数目//*************************** 第一步初始化Winsock *****************************//if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}//******************** 第二步建立一个数据报类型的UDP套接字******************//sockListener=socket(PF_INET,SOCK_DGRAM,0);// setsockopt函数用于设置套接口选项// 采用广播形式须将第三个参数设置为SO_BROADCASTsetsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );//参数设置,注意要将IP地址设为INADDR_BROADCAST,表示发送广播UDP数据报saUdpServ.sin_family = AF_INET;saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );saUdpServ.sin_port = htons (UDP_PORT); //发送用的端口,可以根据需要更改while(1) //循环发送数据{Sleep(1000);sprintf(sendBuff,"Message %d is: ok",ncount++);//将ncount的值放入字符串senBuff中//**********************第三步使用sendto函数进行通信*************************//sendto ( sockListener,/*sendBuff*/pPack, lstrlen (sendBuff)/*sizeof(udpPack)*/, 0, (SOCKADDR *) &saUdpServ, sizeof (SOCKADDR_IN));printf("%sn",sendBuff);//将要广播的数据串输出}//********************* 第四步关闭socket***************************************//closesocket(sockListener); //关闭监听socketWSACleanup();return 0;}const static intBUFFER_LENGTH = 12;接收端程序Receiver.cpp:#include#include#include//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]){WSADATA wsaData; //指向WinSocket信息结构的指针SOCKET sockListener;SOCKADDR_IN sin,saClient;//设置两个地址,sin用来绑定//saClient用来从广播地址接收消息char cRecvBuff[800]; //定义接收缓冲区int nSize,nbSize;int iAddrLen=sizeof(saClient);if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}sockListener=socket(AF_INET, SOCK_DGRAM,0);sin.sin_family = AF_INET;sin.sin_port = htons(7001); //发送端使用的发送端口,可以根据需要更改sin.sin_addr.s_addr = htonl(INADDR_ANY);if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0){printf("Can't bind socket to local port!Program stop.n");//初始化失败返回-1return -1;}while(1){nSize = sizeof ( SOCKADDR_IN );if((nbSize=recvfrom (sockListener,cRecvBuff,800,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误{printf("Recive Error");break;}cRecvBuff[nbSize] = ' ';//字符串终止printf("%sn",cRecvBuff);//显示所接收到的字符串}return 0; }

UDP 和 TCP 的 socket 分别一般用在什么地方
1.UDP是面向分组的,分组间有明确的边界;TCP是面向流字符的,数据流间无边界。 UDP发送一个分组,接收方或者接收完全失败,如果成功整个分组都会接收到。对于TCP,发送一串数字(1,2,3,4,5),接收时有可能变成两次(1,2)和(2,4,5),或者变成任意接收方式,协议栈只保证接收顺序正确。2.UDP属于非连接状态下的不可靠协议,实际运用中很少用到UDP,UDP对于网络资源消耗很少,可以用UDP进行nat穿透。TCP一般用于连接状态下的可靠的协议,比如http,telnet,smtp。3.TCP是可靠的,通过数据校验保证发送和接收到的数据是一致的;UDP是不可靠的,发送一串数字分组(1,2,3)可能接收到时就变成(1,0,0)了,做UDP连接时需要自己做数据校验。4.UDP是无序的,发出(1,2,3),有可能按照(1,3,2)的顺序收到,应用程序必须自己做分组排序;TCP数据是有序的,以什么顺序发送的数据,接收时同样会按照此顺序。5.TCP因为建立连接、释放连接、IP分组校验排序等需要额外工作,速度较UDP慢许多。TCP适合传输数据,UDP适合流媒体。 6.UDP比TCP更容易穿越路由器防火墙。

简述基于TCP和UDP的Socket编程的异同
Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM). 流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。 数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。
tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。
tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。 TCP是一种很保险的链接,需要三次握手,所以数据的发送不会丢失,能根据网络的拥塞自动调整发送的时延,,,而UDP是一种不保险的链接,数据发出去后不管对面会不会收到,多用于语音视频通话中。
实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。 具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/46075.html。