网络环境编程(socket)服务端

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
套接字类型
(1)流式套接字。它提供了一种可靠的、面向连接的双向数据传输服务,实现了数据无差错、无重复的发送。流式套接字内设流量控制,被传输的数据看作是无记录边界的字节流。在TCP/IP协议簇中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据或者对数据传输有较高的要求时,可以使用流式套接字。
(2)数据报套接字。它提供了一种无连接、不可靠的双向数据传输服务。数据包以独立的形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。在TCP/IP协议簇中,使用UDP协议来实现数据报套接字。在出现差错的可能性较小或允许部分传输出错的应用场合,可以使用数据报套接字进行数据传输,这样通信的效率较高。
(3)原始套接字。该套接字允许对较低层协议(如IP或ICMP)进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。

int sockfd = socket(AF_INET,SOCK_STREAM,0);//套接字创建
	if(sockfd == -1){
		perror("socket");
		return -1;
	}
struct sockaddr_in addr = {};//准备端口和ip
	addr.sin_family = AF_INET;
	addr.sin_port = atoi(argv[1]);//端口
	addr.sin_addr.s_addr = inet_addr("192.168.x.xx");
	



int ret = bind(sockfd,(const struct sockaddr*)&addr,sizeof(addr));//把socket和地址(端口和ip)绑定在一起
	if(ret == -1){
		perror("bind");
		return -1;
	}
ret = listen(sockfd,10);//设置等待连接状态
	if(ret == -1){
		perror("listen");
		return -1;
	}
	

```c

struct sockaddr_in caddr = {};//用来接收客户端连接上来的地址
	socklen_t len = sizeof(caddr); 
	//accept 会阻塞 当有客户端连接上来时  该函数返回  得到一个新的 fd 用于和客户端进行交互  每当有客户端连接上来,该函数都会返回
	int fd = accept(sockfd,(struct sockaddr*)&caddr,&len);
	if(fd == -1){
		perror("accept");
		return -1;
	}
pid_t id = fork();
	if(id == -1){
		perror("fork");
		return -1;
	}
	if(id == 0){
		while(true){
			//读写fd
			char buf[1024] = {};
			ret = read(fd,buf,1024);
			if(ret <= 0){
				return 0;	
			}
			printf("recv:%s\n",buf);
			if(strcmp(buf,"bye")==0){
				return 0;	
			}
		}
	}
	while(true){
		char buf[1024] = {};
		gets(buf);
		write(fd,buf,strlen(buf)+1);
		if(strcmp(buf,"bye")==0){
			break;	
		}
	}
	ret = close(sockfd);
	if(ret == -1){
		perror("close");	
	}

	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值