最近正在学习网络编程,用UDP来实现服务器端和客户端的收发的简单通信。由于是第一版,所以写的比较粗糙,很多地方都有要改进的地方。例如:包裹函数,把客户端和服务器端共同都包括的头文件,宏都写在一个公共头文件里等等。以后有时间会继续改进。
首先编写服务器端的程序ser_udp.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
int sockSer = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字,类型参数是SOCK_DGRAM
if(sockSer == -1)//异常处理
{
perror("socket.");
exit(1);
}
struct sockaddr_in addrSer,addrCli;
addrSer.sin_family = AF_INET;//表示协议用的是ipv4协议
addrSer.sin_port = htons(8080);//端口号是8080,并且用htons()将本地字节序转换为网络字节序
addrSer.sin_addr.s_addr = inet_addr("127.0.0.1");//设定ip地址:127.0.0.1
socklen_t addrlen = sizeof(struct sockaddr);//得到结构的长度
int ret = bind(sockSer, (struct sockaddr*)&addrSer,addrlen);//j将套接字和结构地址绑定
if(ret == -1)//异常处理
{
close(sockSer);
perror("bind.");
exit(1);
}
char sendbuf[256];//定义两个字符数组
char recvbuf[256];
while(1)
{
recvfrom(sockSer, recvbuf,256,0, (struct sockaddr*)&addrCli,&addrlen);//先收客户端发来的信息
printf("Cli:> %s\n",recvbuf);//打印收到的信息
printf("Ser:>");
scanf("%s",sendbuf);//输入要发送的数据
sendto(sockSer,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&addrCli,addrlen);//向客户端发送消息
}
}
然后编写客户端的程序cli_udp.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
int sockCli = socket(AF_INET, SOCK_DGRAM,0);
if(sockCli == -1)
{
perror("socket.");
exit(1);
}
struct sockaddr_in addrSer;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(8080);
addrSer.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t addrlen = sizeof(struct sockaddr);
char sendbuf[256];
char recvbuf[256];
while(1)
{
printf("Cli:>");
scanf("%s",sendbuf);
sendto(sockCli,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&addrSer,addrlen);
recvfrom(sockCli,recvbuf,256,0,NULL,NULL);
printf("Ser:> %s\n",recvbuf);
}
}
鉴于服务器端程序写了详细的注释,客户端就不再写注释。需要强调的是,客户端这边是先发送然后在收,服务器是先收再发,
服务器要先收到客户端相关的网络地址信息,才能建立通信。