查看struct sockaddr_in包含的东西:
在/user/include下搜索:grep "struct sockaddr_in { " * -nir
r : 递归
i : 不区分大小写
n : 显示行号
socket编程--服务端代码
c
/*
1、调用 socket 创建套接字
2、调用 bind 添加地址
3、listen 监听
4、accept 连接
5、read
6、write
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
int main()
{
int s_fd;
//1、创建套接字 socket
s_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
if(s_fd == -1){ //返回-1,错误
perror("socket");
exit(-1);
}
//2、添加地址 bind
struct sockaddr_in s_addr; //定义结构体
s_addr.sin_family = AF_INET; //协议族
s_addr.sin_port = htons(8989); //端口号,一般为5000--9000
//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
inet_aton("172.0.0.1",&s_addr.sin_addr);
//把字符串形式的127.0.0.1转换成网络能识别的格式。用到inet_aton
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct socket_in));
//3、监听listen
listen(s_fd,10);//监听10个
//4、连接 accept
int c_fd = accept(s_fd,NULL,NULL);
//连接到客户端之后,后续的操作用返回值c_fd来操作
//5、read
//6、write
printf("connect\n");//数据连接之后打印
while(1);
return 0;
}
编译运行此代码;
windos+R 输入cmd指令,然后ping + ip是否接通;通过之后,输入telnet + ip + 端口号。则该服务器连接客户端成功代码向下运行,打印出connect字符。
windos10系统默认不开启telnet,需要查询开启方法进行开启,再使用该命令。
数据互通:
c
/*
1、调用 socket 创建套接字
2、调用 bind 添加地址
3、listen 监听
4、accept 连接
5、read
6、write
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int s_fd;
int n_read;
char redBuf[128];
char *retmessage = "I get your message!\n";
struct sockaddr_in s_addr; //定义结构体
struct sockaddr_in c_addr;
//数据清空
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1、创建套接字 socket
s_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
if(s_fd == -1){ //返回-1,错误
perror("socket");
exit(-1);
}
//2、添加地址 bind
s_addr.sin_family = AF_INET; //协议族
s_addr.sin_port = htons(8989); //端口号,一般为5000--9000
//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
inet_aton("172.0.0.1",&s_addr.sin_addr);
//把字符串形式的127.0.0.1转换成网络能识别的格式。用到inet_aton
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct socket_in));
//3、监听listen
listen(s_fd,10);//监听10个
//4、连接 accept
int clen = sizeof(struct socket_in);
int c_fd = accept(s_fd,(struct sockaddr *)&c_addr ,&clen);
//连接到客户端之后,后续的操作用返回值c_fd来操作
if(c_fd == -1){
perror("accept");
}
printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));//把网络格式的IP转换为字符格式
//5、read
n_read = read(c_fd,redBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message : %d,%s\n",n_read,redBuf);
}
//6、write
write(c_fd,retmessage,strlen(retmessage));
return 0;
}
在新的界面,telnet + ip + 端口号,实现连接
输出结果:
bash
Trying 172.0.0.1...
Connected to 172.0.0.1.
Escape character is '^]'.
laowang
I get your message!
Connection closed by foreign host.
另一个界面:
bash
get connect : 172.0.0.1
get message : 8,laowang