1. 程式人生 > >網絡編程——UDP編程

網絡編程——UDP編程

運行 recvfrom ret ram 數據 print 編程 return include

一個簡單的聊天代碼:運行結果:

技術分享圖片

在這個程序之中,由於recvfrom函數擁塞函數,沒有數據時會一直阻塞,所以客戶端和服務器端只能通過一回一答的方式進行信息傳遞。嚴格的講UDP沒有明確的客戶端和服務端,誰先進行數據傳輸,誰就是客戶端,客戶端也有可能是服務器端。

代碼1:

 1 #include"common.h"
 2 
 3 int main()
 4 {
 5     int fd;int saddr_len;
 6     int ret;
 7     char buf[1024];
 8     struct sockaddr_in saddr;
 9 
10     fd = socket(AF_INET, SOCK_DGRAM, 0
); 11 if(fd < 0) 12 { 13 printf("create socket fail!\n"); 14 return -1; 15 } 16 17 saddr.sin_family=AF_INET; 18 saddr.sin_port=htons(9000); 19 inet_pton(AF_INET,"192.168.6.128",&saddr.sin_addr.s_addr); 20 21 while(1) 22 { 23 printf("cli:
"); 24 gets(buf); 25 ret=sendto(fd,buf,1024,0,(struct sockaddr*)&saddr,sizeof(saddr)); 26 27 saddr_len=sizeof(saddr); 28 recvfrom(fd,buf,1024,0,(struct sockaddr*)&saddr,&saddr_len); 29 printf("ser:%s\n",buf); 30 } 31 32 close(fd); 33 34 return
0; 35 }

代碼2:

#include"common.h"

int main()
{
    int fd;
    int ret;
    int addr_len;
    struct sockaddr_in saddr,caddr;
    char buf[1024];

    fd=socket(AF_INET,SOCK_DGRAM,0);
    if(fd<0)
    {
        perror("socket");
    }
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(9000);
    inet_pton(AF_INET,"192.168.6.128",&saddr.sin_addr.s_addr);

    ret=bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));
    if (ret<0)
    {
        perror("bind");
    }

    addr_len=sizeof(caddr);
    while(1)
    {
        
        ret=recvfrom(fd,buf,1024,0,(struct sockaddr*)&caddr,&addr_len);
        if(ret==-1)
        {
            perror("cecvfrom");
        }

        printf("cli:%s\n",buf);
        printf("ser:");
        gets(buf);
        sendto(fd,buf,1024,0,(struct sockaddr*)&caddr,sizeof(caddr));
    
    }
    close(fd);
    return 0;
}
            

網絡編程——UDP編程