day2 网络
2023-12-23 03:40:50
1.TCP服务端通信模型
#include <head.h>
#define PORT 9999
#define IP "192.168.125.14"
int main(int argc,const char *argv[])
{
//1、创建套接字
int sfd = -1;
//创建支持TCP通信套接字
//AF_INET:跨主机 IPv4;
if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket error");
return -1;
}
printf("%d\n",sfd);
//2绑定地址信息结构体
//2.1填充地质信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//2.2绑定工作
if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
perror("error");
return -1;
}
printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
//3.设置监听,不再用于通信,内核维护两队列已连接队列和为连接
if(listen(sfd,128)==-1)
{
perror("listen error");
return -1;
}
printf("listen success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
int nsfd=-1;
//接受客户端地址信息结构体
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
//4接受请求,请求连接成功时会返回一个新的套接字文件描述符,用于通信。
if((nsfd=accept(sfd,(struct sockaddr *)&cin,&socklen))==-1)
{
perror("acceot error");
return -1;
}
printf("[%s:%d] 连接成功,nsfd = %d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),nsfd);
char buf[128]="";
//5接受数据
while(1)
{
bzero(buf,sizeof(buf));
int res = recv(nsfd,buf,sizeof(buf),0);
printf("收到客户端消息:%s\n",buf);
strcat(buf,"*-*");
send(nsfd,buf,sizeof(buf),0);
}
//6关闭nsfd,服务端不再是监听状态。
close(nsfd);
//6关闭
close(sfd);
}
2.TCP客户端通信模型
#include<head.h>
#define PORT 9999 //服务器端口号
#define IP "192.168.125.14" //服务器IP地址
#define CIP "192.168.125.14" //客户端
#define CPORT 6666
int main(int argc, const char *argv[])
{
//1、创建套接字
int cfd = -1;
if((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket error");
return -1;
}
printf("sfd = %d\n", cfd); //?
//2、绑定地址信息结构体(必须)
//2.1 填充地址信息结构体
struct sockaddr_in cin;
cin.sin_family = AF_INET; //地址族为IPv4
cin.sin_port = htons(CPORT); //端口号,需要转换网络字节序
cin.sin_addr.s_addr = inet_addr(CIP); //IP地址
//2.2绑定工作
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3请求服务器连接
//3.1定义地址信息的结构体变量
struct sockaddr_in sin;
sin.sin_family = AF_INET; //地址族为IPv4
sin.sin_port = htons(PORT); //端口号,需要转换网络字节序
sin.sin_addr.s_addr = inet_addr(IP); //IP地址
if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
perror("connect error");
return -1;
}
//4、收发数据
char rbuf[128] = ""; //读取消息的容器
while(1)
{
bzero(rbuf, sizeof(rbuf));
fgets(rbuf,sizeof(rbuf),stdin);
rbuf[strlen(rbuf)-1]=0;
//发送
send(cfd,rbuf,sizeof(rbuf),0);
//接收服务器回信
bzero(rbuf, sizeof(rbuf));
recv(cfd,rbuf,sizeof(rbuf),0);
printf("收到服务器:%s\n",rbuf);
}
//关闭
close(cfd);
return 0;
}
3.UDP服务器通信模型
#include<head.h>
#define PORT 9999 //端口号
#define IP "192.168.125.14" //IP地址
int main(int argc, const char *argv[])
{
//1、创建套接字
int sfd = -1;
if((sfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket error");
return -1;
}
//端口号快速重用
int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
//2、绑定IP和端口号(必须)
//2.1 填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
//2.2 绑定
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3、收发数据
char buf[128] = "";
//定义接收客户端地址信息的结构体
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin); //套接字的长度
while(1)
{
bzero(buf,sizeof(buf));
recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &socklen);
printf("[%s:%d]: %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
//回给客户端
strcat(buf, "*_*");
//write(sfd, buf, sizeof(buf));
sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin));
printf("发送成功\n");
}
//4、关闭套接字
close(sfd);
return 0;
}
4.UDP客户端通信模型
#include<head.h>
#define PORT 9999 //端口号
#define IP "192.168.125.14" //IP地址
#define CIP "192.168.125.14"
#define CPORT 6666
int main(int argc, const char *argv[])
{
//1、创建套接字
int cfd = -1;
if((cfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket error");
return -1;
}
//端口号快速重用
int reuse = 1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
//2、绑定IP和端口号(非必须)
//2.1 填充地址信息结构体
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(CPORT);
cin.sin_addr.s_addr = inet_addr(CIP);
//2.2 绑定
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
//3、收发数据
char buf[128] = "";
//定义接收客户端地址信息的结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
while(1)
{
bzero(buf, sizeof(buf));
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
//发送
sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,sizeof(sin));
recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
printf("buf = %s\n", buf);
}
//4、关闭套接字
close(cfd);
return 0;
}
文章来源:https://blog.csdn.net/Aklkimg/article/details/135091605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!