1.网络编程和套接字
网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法。之所以这么说,是因为网络编程大多是基于套接字(socket,网络数据传输的软件设备,操作系统为我们提供的编程接口)来实现数据的输入输出的。
套接字通信过程可以类比打电话的过程(TCP为例)。电话机可以用来拔打和接听,但对于套接字而言,拔打和接听是有区别的。
构建接电话套接字
调用socket函数安装电话机
#include <sys/socket.h> int socket(int domain, int type, int protocol); -> 成功时返回文件描述符,失败时返回-1
调用bind函数分配电话号码
#include <sys/socket.h> int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); -> 成功时返回0,失败时返回-1
调用listen函数连接电话
#include <sys/socket.h> int listen(int sockfd, int backlog); -> 成功时返回0,失败时返回-1
调用accept函数接听电话
#include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); -> 成功时返回文件描述符,失败时返回-1
网络编程中接受连接请求的套接字创建过程总结如下:
1.调用socket函数创建套接字
2.调用bind函数分配IP地址和端口号
3.调用了listen函数转换为可接收请求状态
4.调用accept函数受理连接请求
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <arpa/inet.h> 6 #include <sys/socket.h> 7 8 void error_handling(char *message); 9 10 int main(int argc, char *argv[]) 11 { 12 int serv_sock; 13 int clnt_sock; 14 15 struct sockaddr_in serv_addr; 16 struct sockaddr_in clnt_addr; 17 socklen_t clnt_addr_size; 18 19 char message[]="Hello World!"; 20 21 if(argc!=2){ 22 printf("Usage : %s <port>\n", argv[0]); 23 exit(1); 24 } 25 26 serv_sock=socket(PF_INET, SOCK_STREAM, 0); 27 if(serv_sock == -1) 28 error_handling("socket() error"); 29 30 memset(&serv_addr, 0, sizeof(serv_addr)); 31 serv_addr.sin_family=AF_INET; 32 serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); 33 serv_addr.sin_port=htons(atoi(argv[1])); 34 35 if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) 36 error_handling("bind() error"); 37 38 if(listen(serv_sock, 5)==-1) 39 error_handling("listen() error"); 40 41 clnt_addr_size=sizeof(clnt_addr); 42 clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size); 43 if(clnt_sock==-1) 44 error_handling("accept() error"); 45 46 write(clnt_sock, message, sizeof(message)); 47 close(clnt_sock); 48 close(serv_sock); 49 return 0; 50 } 51 52 void error_handling(char *message) 53 { 54 fputs(message, stderr); 55 fputc('\n', stderr); 56 exit(1); 57 }