B站就业班视频的代码搬运
55课最后部分
我正在自学C++ 跟着这个视频,有同样自学的朋友私信 - -加个qq一起努力啊。
我的以后的努力方向:数据库或者音视频开发。。。
以往的网络代码(tcp ),必须先开服务器端,
(服务器代码中,步骤如下:
socket 函数创建套接字描述符
bind绑定本地(本机当服务器了)上的IP地址和端口一个
listen改为监听模式
然后你去启动客户端文件,服务器端accept函数接受到新连接请求。
然后这篇代码你可以先启动客户端
我写的跟老师比较起来有一个尴尬的bug, 我读出来的n (字符数)都是我设置的缓冲区buf【256】 的长度 256
你也不用开启客户端,只开启服务端的程序后,你再另一个终端截面,用
nc -u 127.0.0.1 8888
这个命令就可以测试了
//udp man 7 udp 服务器端代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd < 0){
perror("socket fun error \n");
return -1;
}
//定义2个地址结gou体,一个是服务地址,一个是客户地址
struct sockaddr_in servad;
struct sockaddr_in clienad;
socklen_t clienlen = sizeof(clienad);
bzero(&servad, sizeof(servad));
bzero(&servad, sizeof(clienad));
servad.sin_family =AF_INET;
servad.sin_port =htons(8888);
servad.sin_addr.s_addr = htonl (INADDR_ANY);
int ret = bind(sfd, (struct sockaddr*)&servad, sizeof( servad));
char buf[256];
while (1) {
//读数据
memset(buf,0x00,sizeof(buf));
int n =recvfrom (sfd, buf, sizeof(buf),0, (struct sockaddr*)&clienad, &clienlen);
if (n <=0){
printf(" read error or client close ,n==[%d]\n", n);
break;
}
else {
printf ("这里是服务器端n =%d ,读到的是%s \n", n,buf);
//将小写字母都转化wie大写
for (int j =0; j
//udp 客户端代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd < 0){
perror("socket fun error \n");
}
//定义1个地址结gou体,是要发送的目的地,服务地址
struct sockaddr_in servad;
bzero(&servad, sizeof( servad));
servad.sin_family =AF_INET;
servad.sin_port =htons(8888);
//这个服务器地址我们只是知道"127.0.0.1"或者一个字符串,转化为网络字节序列,用传入参数那种
// int inet_aton(const char *cp, struct in_addr *inp);
inet_aton("127.0.0.1", &(servad.sin_addr));
int ret = bind(sfd, (struct sockaddr*)&servad, sizeof( servad));
char buf[256];
//ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
// struct sockaddr *src_addr, socklen_t *addrlen);
while (1) {
//客户端,要先发送据
memset(buf,0x00,sizeof(buf));
printf("哈哈哈,输入几个小写字母\n");
int n = read(STDIN_FILENO, buf,sizeof(buf));
sendto (sfd, buf, sizeof(buf),0,(struct sockaddr*)&servad, sizeof(servad));
n =recvfrom (sfd, buf, sizeof(buf),0, NULL, NULL);
if (n <=0){
printf("这里是客户端,啥也没接受到,n==[%d]\n", n);
break;
}
else {
printf("这里是客户端,接受%s\n",buf);
}
}
close(sfd);
return 0;
}
ssize_t recvfrom (int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
用于向另一个套接字(描述符)发送信息。
参数1: 套接字
参数2 :你用来接收结果的字符串
参数3: 参数2的长度
参数4 :标志位,经常填写 0
参数5: 向你发送这个信息的来源地址。
参数6 :参数5的长度的取指针(取地址)
用这个函数,相当于tcp 代码你写recv 函数和 accept函数的结合体。
返回值:成功:你接受到的字节数。
失败:-1. 并且设置errno
ssize_t sendto (int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
用于向另一个套接字(描述符)发送信息。
参数1: 套接字
参数2 :你想发的字符串
参数3: 参数2的长度
参数4 :标志位,经常填写 0
参数5: 你向发送去的 目的地地址。
参数6 :参数5的长度
注意区别
返回值:成功:你写入的字节数。
失败:-1. 并且设置errno