IP地址
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。接入互联网的主机都有它唯一的IP地址。
端口号
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。
端口又分为逻辑端口和物理端口。
物理端口
是用于连接物理设备直接的端口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口,如RJ-45端口、SC端口等等 。
逻辑端口
是指逻辑意义上用于区分服务的端口,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。如TCP/IP协议中的服务端口,通过不同的逻辑端口来区分不同的服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口 。端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535。
Socket套接字
使用的一般是TCP或UDP协议。要注意他们之间的区别
Socket服务器客户端开发步骤
Linux提供的API解析
第一步:创建套接字
第二步:准备好地址
地址转换成API:在服务器中不能直接识别字符串,需要将字符串转换为网络可以识别的格式。
第三步:监听,服务器端搭建好,就开始监听客户端发来的数据,根据发来的数据服务器返回给客户端所需要的数据,只能够用于服务端,
第四步:连接。当客户端调用connect时,服务器调用accept来接收,
数据收发
客户端的connet函数
编程实现:
寻找sockaddr_in下面有哪些结构的步骤
1.输入命令
2.搜索命令行
输入命令 grep "struct sockaddr_in {" * -nir
星号表示在当前目录底下,n:显示行号 i:不区分大小写
这种搜索方式可以搜到它定义的地方,
字节序转API
实验代码
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
//chenlichen
int main(int argc, char **argv)
{
int s_fd;
int c_fd;
int n_read;
char readBuf[128];
int mark = 0;
char msg[128] = {0};
// char *msg = "I get your connect";
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
if(argc != 3){
printf("param is not good\n");
exit(-1);
}
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1. socket 要用man 2 socket 找到所需的头文件
s_fd = socket(AF_INET, SOCK_STREAM, 0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
//2. bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3. listen
listen(s_fd,10);
//4. accept
int clen = sizeof(struct sockaddr_in);
while(1){
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd == -1){
perror("accept");
}
mark++;
printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr));
if(fork() == 0){
if(fork()==0){
while(1){
sprintf(msg,"welcom No.%d client",mark);
write(c_fd,msg,strlen(msg));
sleep(3);
}
}
//5. read
while(1){
memset(readBuf,0,sizeof(readBuf));
n_read = read(c_fd, readBuf, 128);
if(n_read == -1){
perror("read");
}else if(n_read>0){
printf("\nget: %d\n",n_read);
}else{
printf("client quit\n");
break;
}
}
break;
}
}
return 0;
}