一起來玩linux udp通訊程式
阿新 • • 發佈:2018-12-31
在之前的博文中, 我玩過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; }
客戶端程式為:
makefile為:#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; }
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鍵來控制客戶端的傳送和服務端的接受。
試了一下, 能正常執行, 挺有意思的。