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 }
hello_server 示例

相关文章: