2-3-4-5 获取时间的客户端例子 TCP相关

本文深入讲解了TCP服务器编程,包括OSI模型与四层模型对比、bzero与memset函数的区别、TCP时间服务器实现代码示例、三次握手及四次挥手过程、网络字节序转换、socket相关函数介绍、connect常见错误解析及accept的最大连接数等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. OSI7层模型 vs 四层模型


2. bzero vs memset


bzero:#include <stringh.h>,不是标准函数,在ANSI中没有定义。

memset:考虑兼容性等问题的时候还是使用memset吧。


3. TCP编程模型


时间服务器的源码如下:

TCP的连接方式之前在tcpip网路编程中一致,尹圣雨的书籍。

设备端连接上服务器后,将服务器的时间发送给客户端。

#include "socket_includes.h"

int main(int argc, char *argv[])
{
	int listenfd, sockfd, opt = 1;
	struct sockaddr_in server, client;
	char buf[200];
	socklen_t len;
	int timep;
	int ret;
	
	listenfd = socket(AF_INET, SOCK_STREAM, 0);
  if(listenfd < 0){
			perror("Create socket fail.");
			return -1;
  }	
	
	if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
  		perror("Error, set socket reuse addr failed");	
  		return -1;
  }
	
	bzero(&server, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port   = htons(8888);
  server.sin_addr.s_addr  = htonl(INADDR_ANY);
	
	len = sizeof(struct sockaddr);
  if(bind(listenfd, (struct sockaddr *)&server, len)<0){
			perror("bind error.");
      return -1;
  }
	
	listen(listenfd, MAX_LISTEN_QUE);
	
	while(1){
		sockfd = accept(listenfd, (struct sockaddr *)&client, &len);
	  if(sockfd < 0){
				perror("accept error.");
				return -1;
	  }
	  
		timep = time(NULL);
		snprintf(buf, sizeof(buf), "%s", ctime(&timep));
		write(sockfd, buf, strlen(buf));
		printf("Bytes:%d\n", strlen(buf));
		printf("sockfd=%d\n", sockfd);
		close(sockfd);
	}
	return 0;
	
}

4. 三次握手、四次挥手流程

之前的课程中有提到过,这边不再描述,尹圣雨的tcpip编程。


5.网络字节序的转换问题

6. 进程传递到内核的函数:bind、connect、sendto

内核传递到进程的函数:accept, recvfrom,getsockname, getpeername


7. connect经常碰到的错误:

a. 硬错:端口号错误,服务器进程未开启,收到RST,立刻返回ECONNREFUSED;

b. 软错:IP不可达,协议ICMP,比如no route to host,通常是发送arp请求无响应。


8. accept中的最大连接数

对应两个队列:一个是已完成的连接队列;另一个是未完成的连接队列。

最大数指的就是已完成的连接队列最大数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值