1. 程式人生 > >一起來玩linux udp通訊程式

一起來玩linux udp通訊程式

         在之前的博文中, 我玩過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鍵來控制客戶端的傳送和服務端的接受。

        試了一下, 能正常執行, 挺有意思的。