Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376770
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: LINUX

2012-10-26 11:55:37

  最近老师让写一个聊天软件,我把网络编程这块的只是看了一下,聊天的基本雏形出来了,把自己这两天学到的知识和大家分享一下,网络中的实际应用大多都可以归纳为客户机/服务器模型,,其中客户机是指请求服务的一方,服务器是指提供某种服务的一方。通常linux下用的就是套接字编程。
 1.套接字的地址结构是:


  1. struct socket_in{
  2. unsigned short sin family;     //地址类型
  3. unsigned short int sin_port;   //端口号
  4. struct in_addr sin_addr;       //IP地址
  5. unsigned char sin_zero[8];     //填充字节,一般赋值为0.
其中struct in_addr 的类型如下:


  1. struct in_addr{
  2. unsigned long s_addr;
  3. }
一般我们设置地址信息如下代码:


  1. struct sockaddr_in sock;
  2. sock.sin_family=AF_INET;
  3. sock.sin_port=htons(4521);//设置端口号为4521
  4. sock.sin_addr.s_addr=inet_addr(INADDR_ANY); //任意地址
2.创建套接字:
我们可以通过命令man 2 socket 看到socket 的函数原型是:


  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>

  3. int socket(int domain, int type, int protocol);
执行成功返回一个新创建的套接字。若有错误发生返回-1.
3.建立连接。
man connect 的函数原型是:


  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
4.绑定套接字。
 函数bind 用来将一个套接字和某个端口绑定在一起,在shell下输入"man 2 bind"可获取该函数的原型是:


  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
socket函数只是创建了一个套接字,这个套接字将工作在那个端口,程序并没有指定。因此在服务器端的程序中,使用bind函数将一个套接字和某个端口绑定在一起。还函数一般只有服务器端的程序调用。
5.在套接字上监听。
函数listen把套接子转化为被动监听。listen 的函数原型是:


  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int listen(int sockfd, int backlog);  //backlog指定了该连接队列的最大长度。
 函数listen只是将套接字设置为倾听模式以等待连接要求,它并不能接受连接请求,真正接受的是accept()函数。
6.接受连接。
函数accept用来接受一个连接请求。函数原型为:


  1. #include <sys/types.h> /* See NOTES */
  2. #include <sys/socket.h>
  3. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
7.TCP套接字的数据传输
 send用来在TCP套接字上发送数据,获得原型是:


  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  recv用来接受数据:原型为:


  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. ssize_t recv(int sockfd, void *buf, size_t len, int flags);
8.关闭套接字。
 函数close用来关闭一个套接字描述符,它与关闭文件描述符是类似的,可获得它的原型是:


  1. #include <unistd.h>
  2. int close(int fd);


阅读(2425) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~