udp编程

int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen); 
int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

sendto(),是把UDP数据报发给指定地址;
recvfrom()是从指定地址接收UDP数据报。

参数说明
\s:            socket描述符。
\buf:          UDP数据报缓存地址。
\len:          UDP数据报长度。
\flags:        该参数一般为0。
\to:           sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报。
\tolen:        对方地址长度,一般为:sizeof(struct sockaddr_in)。
\fromlen:      recvfrom()函数参数,struct sockaddr_in类型,指明从哪里接收UDP数据报。

udp_server

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

#define UDP_TEST_PORT       50001  

int main(int argC, char* arg[])  
{  

	struct sockaddr_in addr;  
	int sockfd, len = 0;      
	int addr_len = sizeof(struct sockaddr_in);  

	char buffer[256];     
	/* 建立socket,注意必须是SOCK_DGRAM */ 
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
		perror ("socket");  
		exit(1);  
	}  

	/* 填写sockaddr_in 结构 */ 
	bzero(&addr, sizeof(addr));  
	addr.sin_family = AF_INET;  
	addr.sin_port = htons(UDP_TEST_PORT);  
	addr.sin_addr.s_addr = htonl(INADDR_ANY) ;// 接收任意IP发来的数据  

	/* 绑定socket */ 
	if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0) {  
		perror("connect");  
		exit(1);  
	}  

	while(1) {  
		bzero(buffer, sizeof(buffer));  
		len = recvfrom(sockfd, buffer, sizeof(buffer), 0,   
			(struct sockaddr *)&addr ,&addr_len);  

		/* 显示client端的网络地址和收到的字符串消息 */ 
		printf("Received a string from client %s, string is: %s\n",   
			inet_ntoa(addr.sin_addr), buffer);  

		/* 将收到的字符串消息返回给client端 */ 
		sendto(sockfd,buffer, len, 0, (struct sockaddr *)&addr, addr_len);  
	}  

	return 0;  
}  

 udp_client

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


#define UDP_TEST_PORT       50001  
#define UDP_SERVER_IP       "127.0.0.1"      

int main(int argC, char* arg[])  
{  
	struct sockaddr_in addr;  
	int sockfd, len = 0;      
	int addr_len = sizeof(struct sockaddr_in);        

	char buffer[256];  
	/* 建立socket,注意必须是SOCK_DGRAM */ 
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
		perror("socket");  
		exit(1);  
	}  

	/* 填写sockaddr_in*/ 
	bzero(&addr, sizeof(addr));  
	addr.sin_family = AF_INET;  
	addr.sin_port = htons(UDP_TEST_PORT);  
	addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);  


	while(1) {  
		bzero(buffer, sizeof(buffer));  
		printf("Please enter a string to send to server: \n");  

		/* 从标准输入设备取得字符串*/ 
		len = read(STDIN_FILENO, buffer, sizeof(buffer));  

		/* 将字符串传送给server端*/ 
		sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);  

		/* 接收server端返回的字符串*/ 
		len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, &addr_len);  
		printf("Receive from server: %s\n", buffer);  
	}  

	return 0;  
}  

 udp_s

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 
#define PORT 1234
#define MAXDATASIZE 100
 
int main()
{
    int sockfd;
    struct sockaddr_in server;
    struct sockaddr_in client;
    socklen_t addrlen;
    int num;
    char buf[MAXDATASIZE];
 
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
    {
       perror("Creatingsocket failed.");
       exit(1);
    }
 
    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr= htonl (INADDR_ANY);
    if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
    {
       perror("Bind()error.");
       exit(1);
    }   
 
    addrlen=sizeof(client);
    while(1)  
    {
       num =recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr*)&client,&addrlen);                                   
 
       if (num < 0)
       {
          perror("recvfrom() error\n");
          exit(1);
       }
 
       buf[num] = '\0';
       printf("You got a message (%s%) from client.\nIt's ip is%s, port is %d.\n",buf,inet_ntoa(client.sin_addr),htons(client.sin_port)); 
       sendto(sockfd,"Welcometo my server.\n",22,0,(struct sockaddr *)&client,addrlen);
       if(!strcmp(buf,"bye"))
       break;
    }
    close(sockfd);  
}

 udp_c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
 
#define PORT 1234
#define MAXDATASIZE 100
 
int main(int argc, char *argv[])
{
    int sockfd, num;
    char buf[MAXDATASIZE];
 
    struct hostent *he;
    struct sockaddr_in server,peer;
 
    if (argc !=3)
    {
       printf("Usage: %s <IP Address><message>\n",argv[0]);
       exit(1);
    }
 
    if ((he=gethostbyname(argv[1]))==NULL)
    {
       printf("gethostbyname()error\n");
       exit(1);
    }
 
    if ((sockfd=socket(AF_INET, SOCK_DGRAM,0))==-1)
    {
       printf("socket() error\n");
       exit(1);
    }
 
    bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr= *((struct in_addr *)he->h_addr);
    sendto(sockfd, argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server));
    socklen_t  addrlen;
    addrlen=sizeof(server);
    while (1)
    {
       if((num=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&peer,&addrlen))== -1)
       {
          printf("recvfrom() error\n");
          exit(1);
       }
       if (addrlen != sizeof(server) ||memcmp((const void *)&server, (const void *)&peer,addrlen) != 0)
       {
          printf("Receive message from otherserver.\n");
          continue;
       }
 
       buf[num]='\0';
       printf("Server Message:%s\n",buf);
       break;
    }
 
    close(sockfd);
}

 


 

posted on 2014-10-26 21:41  kangbry  阅读(217)  评论(0编辑  收藏  举报

导航