第一章 理解网络编程和套接字
# include <sys/socket.h>
int socket ( int domain, int type , int protocol) ;
int bind ( int sockfd , struct sockaddr * myaddr, socklen_t addrlen) ;
int listen ( int sockfd, int backlog) ;
int accept ( int sockfd, struct sockaddr * addr, socklen_t * addrlen) ;
##以上为服务器端 编译指令:gcc hello_server. c - o hserver
Linux下socket被认为是文件的一种,windows区分socket和文件
0,1,2这三个文件描述符(方便描述文件)为STDIN STDOUT STDERR
int open ( const char * path, int flag) ;
int close ( int fd) ;
ssize_t write ( int fd, const void * buf , size_t nbytes) ;
ssize_t read ( int fd, void * buf, size_t nbytes) ;
windows在这方面的函数与linux差不多,不过套接字有专属类型SOCKET
第二章 套接字类型与协议设置
int socket(int domain, int type , int protocol); 第一个参数为协议族有PF_INET PF_INET6等;第二个参数为套接字类型:有SOCK_STREAM(传送带传糖果,面向连接,无数据边界,可靠有序)和SOCK_DGRAM)(摩托车,不可靠,无序,以数据的高速传输为目的的套接字);最后一个参数默认情况是0
第三章 地址族与数据序列
IPV4传数据是先向网络号传输数据(传到路由器,交换机),再由这个网络具体传给相应主机号的主机
A类地址首字节范围:0-127 B:128-191 C:192-223
NIC(网络接口卡)为数据传输设备,os会将传递到内部的数据分配给套接字,这时需要用到端口号,NIC接收的数据内有端口号,os参考此端口号把数据传给对应套接字;端口号范围0-65535,但0-1023为知名端口
struct sockaddr_in
{
sa_family_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
char sin_zero[ 8 ] ;
}
struct in_addr
{
in_addr_t s_addr;
}
struct sockaddr
{
sa_family_t sin_family;
char sa_data[ 14 ] ;
}
unsigned short htons ( unsigned short ) ;
unsigned short ntohs ( unsigned short ) ;
unsigned long htonl ( unsigned long ) ;
unsigned long htonl ( unsigned long ) ;
数据在传输之前都需要经过转换吗:这个过程是自动的,除了向sockaddr_in结构体变量填充数据外,其他情况无需考虑字节序问题
in_addr_t inet_addr ( const char * string) ;
##成功时返回32 位大端序整数数值,失败时返回INADDR_NONE
int inet_aton ( const char * string, struct in_addr * addr)
##成功返回1 ,失败返回0 ,和上面函数作用一样,不过可以直接给他弄到in_addr结构体里
char * inet_ntoa ( struct in_addr adr) ;
##返回char * 或 - 1 ;需要将得到的char * 保存到新的内存空间里,否则下次用这个函数,他返回的char * 就会变成新的
addr. sin_addr. s_addr = htonl ( INADDR_ANY)
##自动分配本机IP地址,一般服务端才用这个
第四章 基于TCP的服务器端/客户端(1)
listen中的sock成为服务器端套接字,是接收连接或请求的保安
accept会内部产生一个用于数据I/O的套接字,调用accept时,若等待队列为空,则accept函数不会返回,直到队列中出现新的客户端连接
int connect ( int sock, struct sockaddr * servaddr, socklen_t addrlen) ;
##客户端调用connect后只有服务器端接收连接请求(服务器端接收他到等待队列)或发生断网等异常情况
而中断连接请求才会使connect返回;客户端的IP地址和端口在调用connect时自动分配,不用再用bind分
配
agrv agrc参数的描述
###echo服务端
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <arpa/inet.h>
# include <sys/socket.h>
# define BUF_SIZE 1024
void error_handling ( char * message) ;
int main ( int argc, char * agrv[ ] )
{
int serv_sock, clnt_sock;
char message[ BUF_SIZE] ;
int str_len, i;
struct sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_adr_sz;
if ( argc!= 2 ) {
printf ( "Usage : %s <PORT>\n" , agrv[ 0 ] ) ;
exit ( 1 ) ;
}
serv_sock= socket ( PF_INET, SOCK_STREAM, 0 ) ;
if ( serv_sock