1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<netinet/in.h>
5 #include<netinet/ip.h>
6 #include<string.h>
7 #include<unistd.h>
8 #include<arpa/inet.h>
9
10 #define ERR_MSG(msg) do{\
11 fprintf(stderr,"__%d__",__LINE__);\
12 perror(msg);\
13 }while(0);
14
15 #define PORT 2222
16 #define IP "192.168.31.52"
17
18 int main(int argc, const char *argv[])
19 {
20 //创建套接字 socket
21 int cfd=socket(AF_INET,SOCK_STREAM,0);
22 if(cfd < 0)
23 {
24 ERR_MSG("socket");
25 return -1;
26 }
27 printf("socket creat success cfd = %d\n",cfd);
28
29 //设置端口快速被重用
30 int resue = 1;
31 if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&resue,sizeof(resue)) < 0)
32 {
33 ERR_MSG("setsockopt");
34 return -1;
35 }
36
37 //绑定IP和端口
38 //bind(man手册显示的是通用信息结构体) 真实地址结构体用man 7 ip查找
39 //存储端口和ip
40 struct sockaddr_in sin;
41 sin.sin_family = AF_INET; //地址族:必须填AF_INET
42 sin.sin_port = htons(PORT); //端口号:网络字节序
43 sin.sin_addr.s_addr = inet_addr(IP); //IP号,网络字节序
44 //绑定
45 if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
46 {
47 ERR_MSG("bind");
48 return -1;
49 }
50
51 //将套接字设置为被动监听状态 listen
52 if(listen(cfd,128) < 0)
53 {
54 ERR_MSG("listen");
55 return -1;
56 }
57
58
59 //获取连接成功后的套接字 accept
60 //存储连接成功的客户端的地址信息
61 struct sockaddr_in cin;
62 socklen_t addrlen = sizeof(cin);
63 int newfd = accept(cfd,(struct sockaddr*)&cin,&addrlen);
64 if(newfd < 0)
65 {
66 ERR_MSG("accept");
67 return -1;
68 }
69 //接受客户端的信息 recv
70 char buf[128] = "";
71 ssize_t res = -1;
72 while(1)
73 {
74 bzero(buf,sizeof(buf));
75 res = recv(newfd,buf,sizeof(buf),0);
76 if(res < 0)
77 {
78 ERR_MSG("recv");
79 return -1;
80 }
81 else if(0 == res)
82 {
83 fprintf(stderr,"客户端下线\n");
84 break;
85 }
86 printf("%s\n",buf);
87
88 //发送信息给客户端 recv
89 if(send(newfd,buf,sizeof(buf),0) < 0)
90 {
91 ERR_MSG("send");
92 return -1;
93 }
94 printf("send success\n");
95 }
96
97 //关闭套接字 close
98 close(newfd);
99
100 return 0;
101 }
~
~
#include<unistd.h>
8 #include<arpa/inet.h>
9
10 #define ERR_MSG(msg) do{\
11 fprintf(stderr,"__%d__",__LINE__);\
12 perror(msg);\
13 }while(0);
14
15 #define PORT1 2222 //服务器的端口和IP
16 #define IP1 "192.168.31.52"
17
18 #define PORT2 4444 //客户端的端口和IP
19 #define IP2 "192.168.31.52"
20 int main(int argc, const char *argv[])
21 {
22 //创建报式套接字 socket
23 int sfd=socket(AF_INET,SOCK_STREAM,0);
24 if(sfd < 0)
25 {
26 ERR_MSG("socket");
27 return -1;
28 }
29 printf("socket creat success cfd = %d\n",sfd);
30
31 struct sockaddr_in cin;
32 cin.sin_family = AF_INET;
33 cin.sin_port = htons(PORT2);
34 cin.sin_addr.s_addr = inet_addr(IP2);
35 //输入服务器的IP和端口
36 //bind(man手册显示的是通用信息结构体) 真实地址结构体用man 7 ip查找
37 //存储端口和ip
38 struct sockaddr_in sin;
39 sin.sin_family = AF_INET; //地址族:必须填AF_INET
40 sin.sin_port = htons(PORT1); //端口号:网络字节序
41 sin.sin_addr.s_addr = inet_addr(IP1); //IP号,网络字节序
42 //绑定
43 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
44 {
45 ERR_MSG("bind");
46 return -1;
47 }
48
49 //连接服务器 connect
50 if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
51 {
52 ERR_MSG("connect");
53 return -1;
54 }
55 socklen_t addrlen = sizeof(cin);
56 char buf[128] = "";
57 ssize_t res = -1;
58 while(1)
59 {
60 bzero(buf,sizeof(buf));
61 //接受数据
62 res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
63 if(res < 0)
64 {
65 ERR_MSG("recv");
66 return -1;
67 }
68 printf("%s\n",buf);
69
70 //发送信息给服务器
71 if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin)) < 0)
72 {
73 ERR_MSG("sendto");
74 return -1;
75 }
76 printf("send success\n");
77 }
78
79 //关闭套接字 close
80 close(sfd);
81
82 return 0;
83 }
~
~
~