Linux--socket编程--双方收发

socket编程–客户端代码

/*
1、调用 socket 创建套接字
2、connect 连接客户端的listen
3、send
4、read

*/

#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 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 <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 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 <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 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 : 			//服务端输入的东西

多方收发,服务端server自动回复:

/*
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 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};
	
	int mark = 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");
		}

		mark++;
		printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));//把网络格式的IP转换为字符格式
	
		if(fork() == 0){		//fock返回值=0进入子进程,>0进入父进程
			
			if(fork() == 0){		//输入
				memset(retmessage,0,sizeof(retmessage));//初始化
				sprint(retmessage,"welcom No : %d client ",mark);
				sleep(3);
				//每隔三秒发一个状况,确认连接是否丢失
//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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值