1. 程式人生 > >UDP套接字程式設計

UDP套接字程式設計

UDP是使用者資料報協議,與TCP協議一樣,在網路中處理資料包,是一種無連線的傳輸層協議,具有不可靠性,UDP有不提供資料包分組、組裝和不能對資料包進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。
基於UDP的客戶端伺服器:
伺服器:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
void Usage(char* proc) { printf("usage:%s [local_ip][local_port]\n",proc); } int main(int argc,char* argv[]) { if(argc!=3) { Usage(argv[0]); return 3; } int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { perror("socket"); return 1; } struct
sockaddr_in local; local.sin_family=AF_INET; local.sin_port=htons(atoi(argv[2])); local.sin_addr.s_addr=inet_addr(argv[1]); if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) { perror("bind"); return 2; } printf("wait client connect...\n"); char
buf[1024]; struct sockaddr_in client; socklen_t len=sizeof(client); while(1) { ssize_t s=recvfrom(sock,buf,sizeof(buf),0,\ (struct sockaddr*)&client,&len); if(s>0) { buf[s]=0; printf("client say:#%s\n",buf); printf("server say:$"); fflush(stdout); s=read(0,buf,sizeof(buf)-1); buf[s-1]=0; sendto(sock,buf,strlen(buf),0,\ (struct sockaddr*)&client,len); } else if(s==0) { printf("client quit\n"); } else { break; } } close(sock); return 0; }

客戶端:

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void Usage(char* proc)
{
    printf("usage:%s[local_ip]]local_port]\n",proc);
}
int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        return 1;
    }
     int sock = socket(AF_INET,SOCK_DGRAM,0);  
    if(sock < 0)  
    {  
         perror("socket");  
         return 2;  
    }
    struct sockaddr_in server;  
    server.sin_family = AF_INET;  
    server.sin_port = htons(atoi(argv[2]));  
    server.sin_addr.s_addr = inet_addr(argv[1]);

    char buf[1024];
    socklen_t len=sizeof(server);
    while(1)
    {

        printf("client say:#");
        fflush(stdout);
        ssize_t s=read(0,buf,sizeof(buf)-1);
        if(s>0)
        {
            buf[s-1]=0;
            sendto(sock,buf,sizeof(buf),0,\
                    (struct sockaddr*)&server,len); 
            printf("Please wait....\n");
            s= recvfrom(sock,buf,sizeof(buf)-1,0,NULL,NULL); //收到的肯定是伺服器的,這裡就不需要表示出來了。
            buf[s]=0;
            printf("server echo:$%s\n",buf);
        }
        else
        {
            break;
        }
    }
    close(sock);
    return 0;
}