基于udp_socket通信的网络编程

UDP网络编程分为服务端和客户端两部分

UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收发送数据,用函数recvfrom()、sendto();
5、关闭网络连接;

UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置对方的IP地址和端口等属性;
3、连接服务器,用函数connect();若是只是一次发送、接收数据,此函数可不用;若是循环发送接收,则此处要用connect函数;因为若不用,当sendto()后这时服务器器kill掉,则client端阻塞在recvfrom处;
4、循环发送接收数据,用函数sendto()、recvfrom();
5、关闭网络连接;


服务端(server)

/*************************************************************************
	> File Name: udpserver.c
	> Author: kid
	> Mail: 280197326@qq.com 
	> Created Time: 2014年03月01日 星期六 23时25分59秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define MYPORT 3491 		/* 监听端口 */

void main()
{
int sockfd; 			/* 数据端口 */
struct sockaddr_in my_addr; 	/* 自身的地址信息 */
struct sockaddr_in their_addr; 	/* 连接对方的地址信息 */
int sin_size, retval;
char buf[128];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}

my_addr.sin_family = AF_INET; 
my_addr.sin_port = htons(MYPORT); 		/* 网络字节顺序 */
my_addr.sin_addr.s_addr = INADDR_ANY; 	/* 自动填本机IP */
bzero(&(my_addr.sin_zero), 8); 		/* 其余部分置0 */

if  (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) 
{
perror("bind");
exit(1);
}
while(1) { 			/* 主循环 */
retval = recvfrom(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr,&sin_size);
printf("buf %s\n",buf);
printf("Received datagram from %s\n",inet_ntoa(their_addr.sin_addr));

if (retval == 0) {
perror ("recvfrom");
close(sockfd);
break;
}

retval = sendto(sockfd,buf,128,0,(struct sockaddr *)&their_addr,sin_size);
}
}

客户端(client)

/*************************************************************************
	> File Name: udpclient.c
	> Author: kid
	> Mail: 280197326@qq.com 
	> Created Time: 2014年03月01日 星期六 23时21分51秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 3491 		/* Server的端口 */
#define MAXDATASIZE 100	/*一次可以读的最大字节数 */

int main(int argc, char *argv[])
{
int sockfd, numbytes, sin_size;
char buf[MAXDATASIZE] = "Hello, world!\n";
struct hostent *he;		/* 主机信息 */
struct sockaddr_in their_addr; 	/* 对方地址信息 */
if (argc != 2) {
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { 
/* get the host info */
herror("gethostbyname");
exit(1);
}
if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; 
their_addr.sin_port = htons(PORT); 		/* short, NBO */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8); 		/* 其余部分设成0 */
if ((numbytes = sendto(sockfd, buf, MAXDATASIZE, 0, 
	(struct sockaddr *)&their_addr,sizeof(their_addr)))==-1) {
perror("sendto");
exit(1);
}

printf("Send: %s",buf);

if ((numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, 
	(struct sockaddr *)&their_addr, &sin_size))==-1) {
perror("recvfrom");
exit(1);
}

buf[numbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值