linux网络编程1

netstat -apn | grep 端口号     可以查看指定端口号的占用情况

socket:

linux网络编程1

大小端存储法:

linux网络编程1

 

网络字节序:

linux网络编程1

 

linux网络编程1

ip地址转换函数

linux网络编程1

socketaddr:

linux网络编程1

linux网络编程1

 

 

 

流程图:客户端不需要bind,可由客户机随机分配一个(隐式绑定),而服务器一定要显示绑定,否则客户端找不到对象。(客户端比作学生,住哪个宿舍无所谓,服务器比作教室,每天一定要在这个教室上课。)

linux网络编程1
 

bind:往socket上绑定ip和端口号

listen函数指定同时能有多少个客户端能与我建立连接,即处于3次握手队列的连接数之和

socket:

linux网络编程1

bind:

linux网络编程1

listen:

linux网络编程1

accept:accept()系统调用主要用在基于连接的套接字类型,比如SOCK_STREAM和SOCK_SEQPACKET。它提取出所监听套接字的等待连接队列中第一个连接请求创建一个新的套接字,并返回指向该套接字的文件描述符。新建立的套接字不在监听状态,原来所监听的套接字也不受该系统调用的影响。

linux网络编程1

connect:

linux网络编程1

 

代码:

服务器端:图中一句话错了,是调用accept就阻塞监听,而不是listen,listen只是设置最大连接个数

linux网络编程1

linux网络编程1

 

 

 

 

加上打印客户端ip和端口号的功能,以及每次重置serv_addr的功能:

serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);

inet_pton(AF_INET,"192.168.42.100",&serv_addr.sin_addr.s_addr);

这两种方法是等价的,(假设指定本机ip为192.168.42.100

linux网络编程1

linux网络编程1

客户端程序:

linux网络编程1

linux网络编程1

应该加上返回值判断,处理各个函数调用的出错情况

特别注意read函数的返回值情况:

linux网络编程1

 

 

半关闭:

linux网络编程1

time_wait状态时服务还能再次启动,要用到端口复用技术。

linux网络编程1