UDP服务器/客户端代码示例

UDP服务器代码:

 1 #include <errno.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <netinet/in.h>
 7 #include <arpa/inet.h>
 8 #include <iostream>
 9
10 using namespace std;
11
12 int main(int argc, char *argv[])
13 {
14     if (argc != 3)
15     {
16         cout << "usage: " << argv[0] << " ip port" << endl;
17         return -1;
18     }
19
20     char *szIp = argv[1];
21     in_addr_t iIp = inet_addr(szIp);
22     if (iIp == INADDR_NONE)
23     {
24         cerr << "fail to parse ip: " << szIp << endl;
25         return -1;
26     }
27     char *pEnd = NULL;
28     uint16_t usPort = strtoul(argv[2], &pEnd, 10);
29     if (*pEnd != ‘\0‘)
30     {
31         cerr << "fail to parse port: " << argv[2] << endl;
32         return -1;
33     }
34
35     int iSockFd = socket(AF_INET, SOCK_DGRAM, 0);
36     if (iSockFd < 0)
37     {
38         cerr << "fail to create socket, err: " << strerror(errno) << endl;
39         return -1;
40     }
41     cout << "create socket fd " << iSockFd << endl;
42
43     sockaddr_in oAddr;
44     memset(&oAddr, 0, sizeof(oAddr));
45     oAddr.sin_family = AF_INET;
46     oAddr.sin_addr.s_addr = iIp;
47     oAddr.sin_port = htons(usPort);
48     if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0)
49     {
50         cerr << "fail to bind addr " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
51         return -1;
52     }
53     cout << "bind addr " << szIp << ":" >> usPort << endl;
54
55     uint8_t acRecvBuf[64 * 1024];
56     while (true)
57     {
58         sockaddr_in oClientAddr;
59         socklen_t iAddrLen = sizeof(oClientAddr);
60         ssize_t iRecvLen = recvfrom(iSockFd, acRecvBuf, sizeof(acRecvBuf), 0, (sockaddr *)&oClientAddr, &iAddrLen);
61         if (iRecvLen < 0)
62         {
63             cerr << "fail to recv, err: " << strerror(errno) << endl;
64             continue;
65         }
66         cout << "recv data from " << inet_ntoa(oClientAddr.sin_addr) << ":" << ntohs(oClientAddr.sin_port) << ", len: " << iRecvLen << endl;
67
68         ssize_t iSendLen = sendto(iSockFd, acRecvBuf, iRecvLen, 0, (sockaddr *)&oClientAddr, iAddrLen);
69         if (iSendLen < 0)
70         {
71             cerr << "fail to send, err: " << strerror(errno) << endl;
72             continue;
73         }
74         cout << "echo to client, len: " << iSendLen << endl;
75     }
76
77     return 0;
78 }

UDP客户端代码:

 1 #include <errno.h>
 2 #include <string.h>
 3 #include <sys/types.h>
 4 #include <sys/socket.h>
 5 #include <netinet/in.h>
 6 #include <arpa/inet.h>
 7 #include <stdlib.h>
 8 #include <iostream>
 9
10 using namespace std;
11
12 int main(int argc, char *argv[])
13 {
14     if (argc != 4)
15     {
16         cout << "usage: " << argv[0] << " ip port message" << endl;
17         return -1;
18     }
19
20     char *szIp = argv[1];
21     in_addr_t iIp = inet_addr(szIp);
22     if (iIp == INADDR_NONE)
23     {
24         cerr << "fail to parse ip: " << szIp << endl;
25         return -1;
26     }
27     char *pEnd = NULL;
28     uint16_t usPort = strtoul(argv[2], &pEnd, 10);
29     if (*pEnd != ‘\0‘)
30     {
31         cerr << "fail to parse port: " << argv[2] << endl;
32         return -1;
33     }
34     char *szMsg = argv[3];
35     size_t uiMsgLen = strlen(szMsg);
36
37     int iSockFd = socket(AF_INET, SOCK_DGRAM, 0);
38     if (iSockFd < 0)
39     {
40         cerr << "fail to create socket, err: " << strerror(errno) << endl;
41         return -1;
42     }
43     cout << "create socket fd " << iSockFd << endl;
44
45     sockaddr_in oServerAddr;
46     memset(&oServerAddr, 0, sizeof(oServerAddr));
47     oServerAddr.sin_family = AF_INET;
48     oServerAddr.sin_addr.s_addr = iIp;
49     oServerAddr.sin_port = htons(usPort);
50     ssize_t iSendLen = sendto(iSockFd, szMsg, uiMsgLen, 0, (sockaddr *)&oServerAddr, sizeof(oServerAddr));
51     if (iSendLen < 0)
52     {
53         cerr << "fail to send, err: " << strerror(errno) << endl;
54         return -1;
55     }
56     cout << "send to " << szIp <<  ":" << usPort << ", len: " << uiMsgLen << ", msg: " << szMsg << endl;
57
58     char szRecvBuf[64 * 1024];
59     sockaddr_in oRecvAddr;
60     socklen_t iAddrLen = sizeof(oRecvAddr);
61     ssize_t iRecvLen = recvfrom(iSockFd, szRecvBuf, sizeof(szRecvBuf), 0, (sockaddr *)&oRecvAddr, &iAddrLen);
62     if (iRecvLen < 0)
63     {
64         cerr << "fail to recv, err: " << strerror(errno) << endl;
65         return -1;
66     }
67     szRecvBuf[iRecvLen] = ‘\0‘;
68     cout << "recv from " << inet_ntoa(oRecvAddr.sin_addr) << ":" << ntohs(oRecvAddr.sin_port) << ", len: " << iRecvLen << ", msg: " << szRecvBuf << endl;
69
70     return 0;
71 }
时间: 2024-10-18 13:37:57

UDP服务器/客户端代码示例的相关文章

TCP服务器/客户端代码示例

TCP服务器代码: 1 #include <errno.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <iostream> 9 10 usi

SFTP客户端代码示例

SFTP客户端代码示例 环境:libssh2 1.4.3.zlib-1.2.8.openssl-1.0.1g Author: Kagula 最后更新日期:2014-5-18 从http://www.libssh2.org/下载libssh2-1.4.3.tar.gz文件,解压后打开libssh2.dsw文件升级项目到VisualStudio 2013,里面有两个项目,只要编译libssh2项目就可以了.编译前需要添加zlib和openssl的头文件和库文件链接位置,如果编译libssh2提示找不

【windows socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

Kafka JAVA客户端代码示例--高级应用

什么时间使用高级应用? 针对一个消息读取多次 在一个process中,仅仅处理一个topic中的一组partitions 使用事务,确保每个消息只被处理一次 使用高级应用(调用较底层函数)的缺点? SimpleConsumer需要做很多额外的工作(在以groups方式进行消息处理时不需要) 在应用程序中跟踪上次消息处理的offset 确定一个topic partition的lead broker 手工处理broker leander的改变 使用底层函数(SimpleConsumer)开发的步骤

socket编程:简单UDP服务器/客户端编程

对于之前的TCP协议而言,他是可靠的字节流传输,而在socket编程中,在不需要保证数据传输正确安全的情况下.或者由用户自己完成传输确认情况/服务端客户端自己实现数据传输.套接字编程也提供了UDP协议的方法. 基于UDP(不是面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)和服务器端进行通信(sendto) (3)关闭套接字 因为在socket编程中,UDP是针对数据报的数据传输,所以socket专门定义了UDP所使用的函数接口.

【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯

本次实验利用UDP协议, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: 1 /* UDPServer.cpp */ 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <winsock2.h> 6 #include <string.h> 7 #include "

socket本地模拟UDP 服务器+客户端(三)

UDP: TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不能到达就不知道了. 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议. 服务端程序: # 1 创建套接字,并绑定到当地地址 socket,bing # 2 直接接收数据从buffer.Recvfrom(),这个函数接受到数据,和#s

uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)

目前移植uip,发现UDP 服务器模式下,必须指定本地端口以及客户端端口,否则只能讲客户端端口设置为0,才能接收任意端口的数据,但是无法发送数据,因为此时客户端端口设置为0了,我通过将原始数据包中的客户端端口保存下来,并且在发送的时候将客户端端口替换为指定的端口,发送完成之后又设置为0,这样就实现了向任意客户端端口发送数据. uip.c if(uip_udp_conn->lport != 0 && UDPBUF->destport == uip_udp_conn->lpo

Python 绝技 —— UDP 服务器与客户端

i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 -- TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演示了 TCP 服务器与客户端的通信过程. 本篇将按照同样的套路,先介绍传输层的另一个核心协议 UDP,再比较 TCP 与 UDP 的特点,最后借助 Python 脚本演示 UDP 服务器与客户端的通信过程. 0x01 UDP 协议 UDP(User Datagram Protocol,用户数据报协议