带着问题看世界:
- 套接字在网络编程中的作用是什么?为何称为套接字
- 比较说明 listen 函数和 accept 函数的作用
- 创建套接字后一般会为它分配地址,为什么?为了完成地址分配需要调用哪些函数
入门例子就是写一个客户端与服务器通信,示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/01/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #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);
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
|
sockaddr
与 sockaddr_in
的区别
sockaddr
用来代表套接字地址,IPv4 or IPv6
sockaddr_in
用来特指 IPv4
所以套接字接口使用的是 struct sockaddr
,如果定义结构如果使用的是 struct sockaddr_in
则注意强制转换
为了对比,这里也把书中的文件例子重写了一遍,从client.txt读取文件然后写入到另外一个文件server.txt 中
示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/02/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
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);
|
服务端运行结果
1 2 3 4
| [root]#./server 5555 [02/server.c:9 write_file info] ./02/server.txt TCP/IP 网络编程 client.txt [02/server.c:18 write_file info] wirte success [02/server.c:66 main info] write file success
|
客户端结果
1 2 3
| [root]#./client 127.0.0.1 5555 [02/client.c:50 main info] client send msg success [02/client.c:56 main info] receive server reponse:write file success
|
参考文档
- 《TCPIP 网络编程》