在之前的博文中, 我玩过Windows下的udp, 而linux下的udp也类似, 而且, 相比较tcp而言, 我发现我越来越喜欢udp了。话不多说, 直接上菜:
服务端程序为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
struct sockaddr_in srvAddr;
bzero(&srvAddr,sizeof(srvAddr));
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
srvAddr.sin_port = htons(8888);
int srvAddrLen = sizeof(srvAddr);
int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp
bind(iSock, (struct sockaddr *)&srvAddr, sizeof(srvAddr));
while(1)
{
getchar(); // 卡住
char szBuf[1024] = {0};
recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&srvAddr, (socklen_t*)&srvAddrLen); // 注意: 这里用srvAddr是不好的,应该用cliAddr,表示对方地址
printf("msg from client [%s]\n", szBuf);
}
close(iSock);
return 0;
}
客户端程序为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
struct sockaddr_in srvAddr;
bzero(&srvAddr, sizeof(srvAddr));
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
srvAddr.sin_port = htons(8888);
int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp
int i = 0;
while(1)
{
printf("press enter to send data\n");
getchar(); // 卡住
char szBuf[32] = {0};
snprintf(szBuf, sizeof(szBuf), "hello %d", ++i);
sendto(iSock, szBuf, strlen(szBuf) + 1, 0, (struct sockaddr *)&srvAddr, sizeof(srvAddr));
}
close(iSock);
return 0;
}
makefile为:
all: server client
server: server.o
g++ -o server server.o
client: client.o
g++ -o client client.o
server.o: server.cpp
g++ -c server.cpp
client.o:client.cpp
g++ -c client.cpp
clean:
rm -f server client *.o
编译并运行, 先启动服务端, 然后启动客户端。 因为程序中有getchar卡住, 所以我们需要按enter键来控制客户端的发送和服务端的接受。
试了一下, 能正常运行, 挺有意思的。