客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
// UDP 通讯程序代码-Client
int main(int argc, char* argv[])
{
if (argc < 2)
{
printf("Please input something!\r\n");
exit(1);
}
// 因为是UDP套接字,使用SOCK_DGRAM,而不是SOCK_STREAM
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP/*TCP使用0*/);
if (sock < 0)
{
printf("创建套接字失败!\r\n");
exit(1);
}
// Send to
struct sockaddr_in toAddr;
memset(&toAddr, 0, sizeof(toAddr));
toAddr.sin_family = AF_INET;
toAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
toAddr.sin_port = htons(4000);
// Start to send to
if (sendto(sock, argv[1], strlen(argv[1]), 0, (struct sockaddr*)&toAddr, sizeof(toAddr)) != strlen(argv[1]))
{
printf("sendto()函数使用失败!,\r\n");
close(sock);
exit(1);
}
// Receive form
struct sockaddr_in fromAddr;
char recvBuffer[128] = {0};
unsigned int fromLen = sizeof(fromAddr);
if( recvfrom(sock, recvBuffer, 128, 0, (struct sockaddr*)&fromAddr, &fromLen) < 0)
{
printf("recvfrom()函数使用失败!,\r\n");
close(sock);
exit(1);
}
// 把接收的数据输出到屏幕上
printf("recvfrom()result: %s\r\n", recvBuffer);
close(sock);
return 0;
}
服务端
// UDP Server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
// Create UDP socket
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock < 0)
{
printf("Create socket faild\r\n");
exit(1);
}
// Bind socket and the client of send link request
struct sockaddr_in fromAddr;
memset(&fromAddr, 0, sizeof(fromAddr));
fromAddr.sin_family = AF_INET;
fromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
fromAddr.sin_port = htons(4000);
if (bind(sock, (struct sockaddr*)&fromAddr, sizeof(fromAddr)) < 0)
{
printf("Bind socket faild!\r\n");
close(sock);
exit(1);
}
struct sockaddr_in toAddr;
char recvBuffer[128] = {0};
int recvLen = -1;
unsigned int addrLen = sizeof(toAddr);
while(1)
{
if ((recvLen = recvfrom(sock, recvBuffer, 128, 0, (struct sockaddr*)&toAddr, &addrLen)) < 0)
{
printf("Receive message faild!\r\n");
close(sock);
exit(1);
}
if (recvLen > 0)
{
printf("Recive message:%s\r\n", recvBuffer);
}
if (sendto(sock, recvBuffer, recvLen, 0, (struct sockaddr*)&toAddr, sizeof(toAddr)) != recvLen)
{
printf("sendto faild\r\n");
close(sock);
exit(1);
}
}
close(sock);
return 0;
}