/*
1、调用 socket 创建套接字
2、connect 连接客户端的listen
3、send
4、read
*/
#include
#include
#include
//#include
#include
#include
#include
#include
int main()
{
int c_fd;
int n_read;
char redBuf[128];
char *retmessage = "message from client!";
//定义结构体
struct sockaddr_in c_addr;
//数据清空
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1、创建套接字 socket
c_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
if(c_fd == -1){ //返回-1,错误
perror("socket");
exit(-1);
}
c_addr.sin_family = AF_INET; //协议族
c_addr.sin_port = htons(8989); //端口号,一般为5000--9000
//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
inet_aton("172.0.0.1",&c_addr.sin_addr);
//把字符串形式的127.0.0.1转换成网络能识别的格式。用 到inet_aton
//2、connect 连接客户端的listen
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
perror("connect");
exit(-1);
}
printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));//把网络格式的IP转换为字符格式
//3、send
write(c_fd,retmessage,strlen(retmessage));
//4、read
n_read = read(c_fd,redBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message from server! : %d,%s\n",n_read,redBuf);
}
return 0;
}
双方多次互通:
服务端:
//Linux--socket编程--多次互通--服务端server
/*
1、调用 socket 创建套接字
2、调用 bind 添加地址
3、listen 监听
4、accept 连接
5、read
6、write
*/
#include
#include
#include
//#include
#include
#include
#include
#include
int main(int argc,char **argv)//配置端口
{
int s_fd;
int c_fd;
int n_read;
char redBuf[128];
//char *retmessage = "I get your message!";
char retmessage[128] = {0};
struct sockaddr_in s_addr; //定义结构体
struct sockaddr_in c_addr;
if(argc != 3){
printf("param is not good"); //参数不好
exit(-1);
}
//数据清空
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(atoi(argv[2])); //端口号,一般为5000--9000
//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
inet_aton(argv[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);
while(1){
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转换为字符格式
if(fork() == 0){ //fock返回值=0进入子进程,>0进入父进程
if(fork() == 0){ //输入
printf("input : ");
memset(retmessage,0,sizeof(retmessage));//初始化
gets(retmessage);
//6、write
write(c_fd,retmessage,strlen(retmessage));
}
//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);
}
break; //进行一次
}
}
return 0;
}
客户端:
//Linux--socket编程--多次互通--客户端client
/*
1、调用 socket 创建套接字
2、connect 连接客户端的listen
3、send
4、read
*/
#include
#include
#include
//#include
#include
#include
#include
#include
int main(int argc,char **argv)
{
int c_fd;
int n_read;
char redBuf[128];
//char *retmessage = "message from client!";
char retmessage[128] = {0};
//定义结构体
struct sockaddr_in c_addr;
//数据清空
memset(&c_addr,0,sizeof(struct sockaddr_in));
if(argc != 3){
printf("param is not good"); //参数不好
exit(-1);
}
//1、创建套接字 socket
c_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
if(c_fd == -1){ //返回-1,错误
perror("socket");
exit(-1);
}
c_addr.sin_family = AF_INET; //协议族
c_addr.sin_port = htons(atoi(argv[2])); //端口号,一般为5000--9000
//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
inet_aton(argv[1],&c_addr.sin_addr);
//把字符串形式的127.0.0.1转换成网络能识别的格式。用 到inet_aton
//2、connect 连接客户端的listen
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
perror("connect");
exit(-1);
}
printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));//把网络格式的IP转换为字符格式
while(1){
if(fork() == 0){ //fock返回值=0进入子进程,写数据
printf("input : ");
memset(retmessage,0,sizeof(retmessage));//初始化
gets(retmessage);
//3、send
write(c_fd,retmessage,strlen(retmessage));
}
//4、read
n_read = read(c_fd,redBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message from server! : %d,%s\n",n_read,redBuf);
}
}
return 0;
}
在服务端运行:./文件名 + IP + 端口号
在客户端运行:./文件名 + IP + 端口号
服务端得到:并且不会退出
get connect : ip
input : //输入
get message : //客户端输入的东西
客户端得到:
input : //输入
get message : //服务端输入的东西