最近老师让写一个聊天软件,我把网络编程这块的只是看了一下,聊天的基本雏形出来了,把自己这两天学到的知识和大家分享一下,网络中的实际应用大多都可以归纳为客户机/服务器模型,,其中客户机是指请求服务的一方,服务器是指提供某种服务的一方。通常linux下用的就是套接字编程。 1.套接字的地址结构是:
- struct socket_in{
- unsigned short sin family; //地址类型
- unsigned short int sin_port; //端口号
- struct in_addr sin_addr; //IP地址
- unsigned char sin_zero[8]; //填充字节,一般赋值为0.
其中struct in_addr 的类型如下:- struct in_addr{
- unsigned long s_addr;
- }
一般我们设置地址信息如下代码:- struct sockaddr_in sock;
- sock.sin_family=AF_INET;
- sock.sin_port=htons(4521);//设置端口号为4521
- sock.sin_addr.s_addr=inet_addr(INADDR_ANY); //任意地址
2.创建套接字:我们可以通过命令man 2 socket 看到socket 的函数原型是:
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int socket(int domain, int type, int protocol);
执行成功返回一个新创建的套接字。若有错误发生返回-1.3.建立连接。
man connect 的函数原型是:
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
4.绑定套接字。 函数bind 用来将一个套接字和某个端口绑定在一起,在shell下输入"man 2 bind"可获取该函数的原型是:
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
socket函数只是创建了一个套接字,这个套接字将工作在那个端口,程序并没有指定。因此在服务器端的程序中,使用bind函数将一个套接字和某个端口绑定在一起。还函数一般只有服务器端的程序调用。5.在套接字上监听。
函数listen把套接子转化为被动监听。listen 的函数原型是:
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int listen(int sockfd, int backlog); //backlog指定了该连接队列的最大长度。
函数listen只是将套接字设置为倾听模式以等待连接要求,它并不能接受连接请求,真正接受的是accept()函数。6.接受连接。
函数accept用来接受一个连接请求。函数原型为:
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
7.TCP套接字的数据传输 send用来在TCP套接字上发送数据,获得原型是:
- #include <sys/types.h>
- #include <sys/socket.h>
- ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv用来接受数据:原型为:- #include <sys/types.h>
- #include <sys/socket.h>
- ssize_t recv(int sockfd, void *buf, size_t len, int flags);
8.关闭套接字。 函数close用来关闭一个套接字描述符,它与关闭文件描述符是类似的,可获得它的原型是:
- #include <unistd.h>
- int close(int fd);
阅读(2429) | 评论(0) | 转发(1) |