tcp通信
服务器端:
1 #include <head.h>
2
3
4 #define PORT 9999 //服务器端口号,是2字节整数
5 #define IP "192.168.125.22" //服务器ip地址
6 int main(int argc, const char *argv[])
7 {
8 //1.创建套接字
9 int sfd=-1;
10 //功能:创建一个支持TCP通信的套接字
11 //socket(通信域,通信类型,通信协议)
12 if ((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
13 {
14 perror("socket error");
15 return -1;
16 }
17 printf("sfd=%d\n",sfd);//如果是服务器端,这个描述符用于服务器和客户端连接
18 //2.绑定地址信息结构体
19 //2.1填充地址信息结构体
20 struct sockaddr_in sin;
21 sin.sin_family=AF_INET;//地址组
22 sin.sin_port=htons(PORT);//端口号
23 sin.sin_addr.s_addr=inet_addr(IP);//IP地址
24 //2.2绑定工作
25 //bind(套接字文件描述符,通用地址信息结构体,地址信息结构体的大小)
26 if (bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
27 {
28 perror("bind error");
29 return -1;
30 }
31 printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
32 //3.将套接字设置成被动监听状态
33 //listen(套接字文件描述符,未连接队列的最大长度,一般128)
34 if (listen(sfd,128)==-1)
35 {
36 perror("listen error");
37 return -1;
38 }
39 printf("listen success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
40 //4.接收客户端连接请求
41 //4.1定义用于接收客户端地址信息的结构体变量
42 struct sockaddr_in cin;
43 //接收长度
44 socklen_t socklen=sizeof(cin);
45 int newfd=-1;//定义一个用于跟客户端通信的套接字文件描述符
46 //4.2接受客户端链接请求
47 //返回值是用于连接的文件描述符=accept(套接字文件描述符,客户端地址信息结构体变量指针,接收的长度)
48 if ((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1)
49 {
50 perror("accept error");
51 return -1;
52 }
53 //这里ip地址和端口号分别是%s和%d输出
54 //将ip地址的网络字节序转换为点分十进制
55 //将端口号的网络字节序转换为主机字节序
56 printf("[%s,%d]连接成功,newfd=%d\n",inet_ntoa(cin.sin_addr),\
57 ntohs(cin.sin_port),newfd);
58 //5.收发数据
59
60 char rbuf[128]="";//读取消息的容器
61 while(1)
62 {
63 //将数组清0
64 bzero(rbuf,sizeof(rbuf));
65 //从客户端读取数据recv
66 //recv(用于通信的文件描述符,容器首地址,容器的大小,0是阻塞读取)
67 int res=recv(newfd,rbuf,sizeof(rbuf),0);
68 if (res==0)//读完了
69 {
70 printf("客户端下线\n");
71 break;
72 }
73 //客户端说了什么
74 printf("[%s,%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);
75 //服务器收到客户端的消息,加一个*_*返给服务器
76 strcat(rbuf,"*_*");
77 //向newfd描述符中以阻塞的形式发送数据
78 send(newfd,rbuf,sizeof(rbuf),0);
79
80 }
81 //关闭套接字文件描述符
82 close(sfd);
83 close(newfd);
84 return 0;
85 }
~
~
~
~
~
~
~
~
~
~
~
~
客户端
1 #include <head.h>
2 #define CLIPORT 8888 //客户端端口号
3 #define CLIIP "192.168.125.22" //客户端ip地址
4
5 #define SERPORT 9999 //服务器端口号,是2字节整数
6 #define SERIP "192.168.125.22" //服务器ip地址
7 int main(int argc, const char *argv[])
8 {
9 //1.创建套接字
10 int cfd=-1;
11 //功能:创建一个支持TCP通信的套接字
12 //socket(通信域,通信类型,通信协议)
13 if ((cfd=socket(AF_INET,SOCK_STREAM,0))==-1)
14 {
15 perror("socket error");
16 return -1;
17 }
18 printf("cfd=%d\n",cfd);//如果是客户端,这个描述符用于服务器和客户端通信
19 //将端口号快速重用
20 int reuse=-1;
21 if (setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
22 {
23 perror("reuse error");
24 return -1;
25 }
26 //2.绑定地址信息结构体(非必须绑定)
27 //2.1填充客户端地址信息结构体
28 struct sockaddr_in cin;
29 cin.sin_family=AF_INET;//地址组
30 cin.sin_port=htons(CLIPORT);//端口号
31 cin.sin_addr.s_addr=inet_addr(CLIIP);//IP地址
32 //2.2绑定工作
33 //bind(套接字文件描述符,通用地址信息结构体,地址信息结构体的大小)
34 if (bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
35 {
36 perror("bind error");
37 return -1;
38 }
39 printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
40 //3.请求连接服务器
41 //3.1填充服务器端地址信息结构体
42 struct sockaddr_in sin;
43 sin.sin_family=AF_INET;//地址组
44 sin.sin_port=htons(SERPORT);//端口号
45 sin.sin_addr.s_addr=inet_addr(SERIP);//IP地址
46 //3.2连接服务器
47 if (connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
48 {
49 perror("connect error");
50 return -1;
51 }
52 printf("connect success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
53 //4.收发数据
54 char wbuf[128]="";
55 while(1)
56 {
57 //将数组清0
58 bzero(wbuf,sizeof(wbuf));
59 //输入内容
60 fgets(wbuf,sizeof(wbuf),stdin);//从终端获取
61 wbuf[strlen(wbuf)-1]=0;
62
63 //将数据传给服务器
64 send(cfd,wbuf,sizeof(wbuf),0);
65 //接收服务器发来的消息
66 bzero(wbuf,sizeof(wbuf));
67 //recv(用于通信的文件描述符,容器首地址,容器的大小,0是非阻塞读取)
68 int res=recv(cfd,wbuf,sizeof(wbuf),0);
69 if (res==0)//读完了
70 {
71 printf("服务器端下线\n");
72 break;
73 }
74 //服务器端说了什么
75 printf("[%s,%d]:%s\n",SERIP,SERPORT,wbuf);
76 }
77 //关闭套接字文件描述符
78 close(cfd);
79 return 0;
80 }
~
~
~
~
~
~
~
~
~
udp通信
服务器端:
1 #include <head.h>
2 #define PORT 8888
3 #define IP "192.168.125.22"
4 int main(int argc, const char *argv[])
5 {
6 //1.创建通信套接字
7 int sfd=-1;
8 if ((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
9 {
10 perror("socket eror");
11 return -1;
12 }
13 //2.绑定
14 struct sockaddr_in sin;
15 sin.sin_family=AF_INET;
16 sin.sin_port=htons(PORT);
17 sin.sin_addr.s_addr=inet_addr(IP);
18 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
19 {
20 perror("bind error");
21 return -1;
22 }
23 printf("bind success\n");
24 //3.收发数据
25 //创建客户端的地址信息结构体
26 struct sockaddr_in cin;
27 //接收长度
28 socklen_t socklen=sizeof(cin);
29 char buf[128]="";
30 while(1)
31 {
32 bzero(buf,sizeof(buf));
33 recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&socklen);
34 printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
35 strcat(buf,"*_*");
36 sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin));
37 }
38
39 return 0;
40 }
~
~
~
~
~
~
客户端:
1 #include <head.h>
2 #define PORT 8888
3 #define IP "192.168.125.22"
4 int main(int argc, const char *argv[])
5 {
6 int cfd=-1;
7 if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
8 {
9 perror("socket error");
10 return -1;
11 }
12 struct sockaddr_in sin;
13 sin.sin_family=AF_INET;
14 sin.sin_port=htons(PORT);
15 sin.sin_addr.s_addr=inet_addr(IP);
16 socklen_t socklen=sizeof(sin);
17 char buf[128]="";
18 while (1)
19 {
20 bzero(buf,sizeof(buf));
21 fgets(buf,sizeof(buf),stdin);
22 buf[strlen(buf)-1]=0;
23 sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,socklen);
24 recv(cfd,buf,sizeof(buf),0);
25 printf("[%s:%d]:%s\n",IP,PORT,buf);
26 }
27 return 0;
28 }
~
~
~