TCP实现网络通信
1.服务端
#include<myhead.h>
//1服务端定义:端口号\id号
#define SER_PIPR 6666
#define SER_IP "196.168.111.186" //通过ifconfig查看ip
int main(int argc, const char *argv[])
{
//1创建套接字
int sfd =socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
perror("socket error");
return -1;
}
//2.将端口号快速重用
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
{
perror("setsockipt error");
return -1;
}
//2为套接字绑定端口号和ip
//2.1填充地址结构体
struct sockaddr_in sin;
sin.sin_family=AF_INET; //通信域名
sin.sin_port=htons(SER_PIPR); //端口号
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;
}
//3.将套接字设置成被动监听状态
if(listen(sfd,128)==-1)
{
perror("listen error");
return -1;
}
//4.阻塞等待客户的连接请求
//4.1定义勇于接收客户端的信息
struct sockaddr_in cin;//用于接收地址信息
socklen_t addrlen = sizeof(cin); //用于接收长度
//4.2接收连接
int newfd= accept(sfd,(struct sockaddr*)&cin,&addrlen);
if(newfd==-1)
{
perror("accept error");
return -1;
}
printf("[%s:%d]:已成功连接一个客户端\n",
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
//5.数据的收发
char buf[128]="";
while(1)
{
//清空容器
bzero(buf,sizeof(buf));
//从可读端读取信息
int res=recv(newfd,buf,sizeof(buf),0);
if(res==-1)
{
perror("recv error");
return -1;
}
else if(res == 0)
{
printf("客户端已经下线\n");
close(newfd);
break;
}
printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
//对收到的消息进行一顿操作
strcat(buf,"*_*");
//将消息回复给客户端
if(send(newfd,buf,strlen(buf),0)==-1)
{
perror("发送error");
return -1;
}
printf("发送成功\n");
}
//关闭监听
close(sfd);
return 0;
}
2.客户端
1 #include<myhead.h>
2 #define SER_PORT 6666 //与服务器保持一致
3 #define SER_IP "192.168.111.186" //服务器ip地址
4
5 #define CLI_PORT 8888 //客户端端口号
6 #define CLI_IP "192.168.111.186" //客户端ip地址
7 int main(int argc, const char *argv[])
8 {
9 //1.创建用于通信的套接字文件描述符
10 int cfd=socket(AF_INET,SOCK_STREAM,0);
11 if(cfd==-1)
12 {
13 perror("socket error");
14 return -1;
15 }
16 printf("cfd = %d",cfd);
17 //2.绑定ip地址和端口号
18 //2.1填充地址信息结构体
19 struct sockaddr_in cin;
20 cin.sin_family = AF_INET; //通信域
21 cin.sin_port = htons(CLI_PORT); //端口号
22 cin.sin_addr.s_addr = inet_addr(CLI_IP); //ip地址
23
24 //2.2绑定工作
25 if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
26 {
27 perror("bind error");
28 return -1;
29 }
30 printf("bind success\n");
31
32 //3.连接到服务器
33 //3.1填充服务器地址信息结构体
34 struct sockaddr_in sin;
35 sin.sin_family=AF_INET; //服务器的通信域
36 sin.sin_port= htons(SER_PORT); //服务器端口号
37 sin.sin_addr.s_addr=inet_addr(SER_IP); //服务器ip地址
38
39 //3.2连接服务器
40 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
41 {
42 perror("connect error");
43 return -1;
44 }
45 printf("连接服务器成功\n");
46 //4.数据收发
47 char buf[128]="";
48 while(1)
49 {
50 printf("请输入>>>");
51 fgets(buf,sizeof(buf),stdin); //从终端获取字符串
52 buf[strlen(buf)-1]=0;
53
54 //将数据发送给服务器
55 send(cfd,buf,strlen(buf),0);
56 printf("发送成功\n");
57
58 //清空容器
59 bzero(buf,sizeof(buf));
60
61 //接受服务器发来的的数据
62 recv(cfd,buf,sizeof(buf),0);
63
64 printf("收到服务器消息为:%s\n",buf);
65
66 }
67
68 //5.关闭套接字
69 close(cfd);
70
71 return 0;
72 }
UDP实现网路通信
1.服务端
1 #include<myhead.h>
2 #define SER_PORT 9999 //服务器端口号
3 #define SER_IP "192.168.111.186" //服务器ip地址
4 int main(int argc, const char *argv[])
5 {
6 //创建用于通信的服务器套接字描述符
7 int sfd = socket(AF_INET,SOCK_DGRAM,0);
8 if(sfd==-1)
9 {
10 perror("socket error");
11 return -1;
12 }
13
14 printf("sfd = %d\n",sfd);
15
16 //将端口号快速重用
17 int resuse = 1;
18 if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&resuse,sizeof(resuse))==-1)
19 {
20 perror("setsockopt error");
21 return -1;
22 }
23
24 printf("将端口号快速重用成功\n");
25
26 //2.绑定ip地址和端口号
27 //2.1填充地址信息结构体
28 struct sockaddr_in sin;
29 sin.sin_family = AF_INET; //通信域
30 sin.sin_port = htons(SER_PORT); //端口号
31 sin.sin_addr.s_addr = inet_addr(SER_IP); //IP地址
32 //2.2绑定工作
33 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
34 {
35 perror("bind error");
36 return -1;
37 }
38
39 //3.数据收发
40 char buf[128]="";
41 struct sockaddr_in cin; //接受对端地址信息
42 socklen_t addrlen = sizeof(cin); //接收地址长度
43 while(1)
44 {
45 //清空容器
46 bzero(buf,sizeof(buf));
47
48 //从套接字中读取数据
49 recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
50 printf("收到的消息为:%s\n",buf);
51
52 //收到的消息进行处理
53 strcat(buf,"*_*");
54
55 if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1)
56 {
57 perror("发送error");
58 return -1;
59 }
60 printf("发送成功\n");
61 }
62 //4.关闭文件描述符
63
64 return 0;
65 }
2.客户端
思维导图: