一.进程间通信回顾
管道、消息队列、共享内存、信号和信号量。
特点:依赖于Linux内核
缺陷:无法多机通讯(Linux服务器与手机、51单片机等的通信)
网络编程:IP地址、端口号(找到哪台设备)
数据:协议(http\tcp\udp)(进行对话)
socket套接字:TCP->面向连接(可靠)
UDP->面向报文(不可靠 优:数据量大)
二.字节序
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
常见的字节序:小端字节序(将低序字节存储在起始地址):Little endian
大端字节序(将高序字节存储在起始地址):Big endian
网络字节序=大端字节序
三.Linux提供的API简析
1.创建套接字
2.bind函数
3.监听
listen在服务端,客户端没有
4.连接
四.socket服务端代码实现
1.服务端代码
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9
10 int main()
11 {
12 int s_fd;
13 int n_read;
14 char readBuf[128];
15
16 char *msg="I get your connect";
17 struct sockaddr_in s_addr;
18 struct sockaddr_in c_addr;
19
20 memset(&s_addr,0,sizeof(struct sockaddr_in));
21 memset(&c_addr,0,sizeof(struct sockaddr_in));
22
23
24 s_fd=socket(AF_INET,SOCK_STREAM,0);
25 if(s_fd==-1){
26 perror("socket");
27 exit(-1);
28 }
29
30 s_addr.sin_family=AF_INET;
31 s_addr.sin_port=htons(8988);
32 inet_aton("172.20.10.3",&s_addr.sin_addr);
33
34 bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
35
36 listen(s_fd,10);
37 int clen= sizeof(struct sockaddr_in);
38 int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);
39
40 if(c_fd==-1){
41 perror("accpet");
42 }
43
44 printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));
45 n_read=read(c_fd,readBuf,128);
46 if(n_read == -1){
47 perror("read");
48 }
49 else{
50 printf("get message:%d,%s\n",n_read,readBuf);
51 }
52 write(c_fd,msg,strlen(msg));
53
54
55 return 0;
56
57 }
~
~
~
2.客户端代码
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9
10 int main()
11 {
12 int c_fd;
13 int n_read;
14 char readBuf[128];
15
16 char *msg="msg from client";
17 struct sockaddr_in c_addr;
18
19
20 memset(&c_addr,0,sizeof(struct sockaddr_in));
21
22
23 c_fd=socket(AF_INET,SOCK_STREAM,0);
24 if(c_fd==-1){
25 perror("socket");
26 exit(-1);
27 }
28
29 c_addr.sin_family=AF_INET;
30 c_addr.sin_port=htons(8988);
31 inet_aton("172.20.10.3",&c_addr.sin_addr);
32
33 if( connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1){
34 perror("connect");
35 exit(-1);
36 }
37 write(c_fd,msg,strlen(msg));
38
39
40 n_read=read(c_fd,readBuf,128);
41 if(n_read == -1){
42 perror("read");
43 }
44 else{
45 printf("get message from server:%d,%s\n",n_read,readBuf);
46 }
47
48
49 return 0;
50
51 }
~
~