网络编程day2
基于UDP的通信方式
服务器端
include<myhead.h>
//宏定义ip地址和端口号
#define SER_IP "192.168.109.125"
#define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[])
{//1、创建服务器套接字文件描述符:用于通信int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == sfd){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd); //3//设置套接字属性:允许端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定ip地址和端口号//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //配置通信域sin.sin_port = htons(SER_PORT); //配置端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //配置ip地址//2.2 绑定操作if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、数据收发//定义地址信息结构体变量,以便于接收对端地址信息结构体struct sockaddr_in cin;socklen_t addrlen = sizeof(cin); //接收地址信息的大小while(1){char rbuf[128] = ""; //定义接收消息的容器//接收客户端消息recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);//给消息加个笑脸还回去strcat(rbuf, "*_*");//向客户端发送消息sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin));printf("发送成功\n");}//4、关闭服务器close(sfd);return 0;
}
客户端
include<myhead.h>#define SER_IP "192.168.109.125" //服务器ip地址
#define SER_PORT 8888 //服务器端口号
#define CLI_IP "192.168.109.125" //客户端ip地址
#define CLI_PORT 9999 //客户端端口号int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(-1 == cfd){perror("socket error");return -1;}printf("socket success cfd = %d\n", cfd); //3//2、绑定ip地址和端口号(可选)//2.1 填充客户端地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET; //通信域cin.sin_port = htons(CLI_PORT); //客户端端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); //客户端ip地址//2.2 进行绑定工作if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、数据收发//封装服务器的地址信息结构体struct sockaddr_in sin; //服务器地址信息结构体sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT); //服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //服务器ip地址socklen_t addrlen = sizeof(sin); //地址信息结构体的大小while(1){char wbuf[128] = "";//从终端获取一个字符串fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//将消息发送给服务器sendto(cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, addrlen);printf("发送成功\n");//接收服务器回复的消息recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到消息为:%s\n", wbuf);}//4、关闭客户端close(cfd);return 0;
}