Chinaunix首页 | 论坛 | 博客
  • 博客访问: 498748
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: C/C++

2016-10-23 16:58:04

一、SOCKET编程
创建一个传输终端:socket
函数原型:int socket(int domain, int type, int protocol);
头文件:sys/types.h sys/socket.h
成功:返回新的socket文件描述符  失败:-1
domain:协议类型
type:socket类型
protocol:选择特定协议,默认为0.

绑定地址(绑定网卡):bind
函数原型:int bind(int sockfd, cosnt struct sockaddr *addr, socklen_t addrlen);
头文件:sys/types.h sys/socket.h
成功:返回0 失败:-1
sockfd:socket文件描述符
addr:socket的结构地址
addrlen:地址的长度

设置监听:listen
函数原型:int listen(int sockfd, int backlog);
头文件: sys/types.h sys/socket.h
成功:返回0 失败: -1
sockfd:socket文件描述符
backlog:表示高进程所要入队的连接请求数量

等待连接:accept
函数原型: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
头文件:sys/types.h sys/socket.h
成功:返回接受后新的描述符 失败: -1

sockfd:socket文件描述符
addr:socket的结构地址
*addrlen:地址的长度的指针

发送消息:send
函数原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);
头文件: sys/types.h sys/socket.h
成功:返回发送的数量 失败:-1
sockfd:ssocket文件描述符
*buf:需要发送的内容
len:需要发送的长度
flags:发送标识符(不同于write的区别)

连接服务器:connect
函数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
头文件: sys/types.h sys/socket.h
成功:0 失败:-1
sockfd:ssocket文件描述符
addr:socket的结构地址
addrlen:地址的长度

二、地址类型
  1. struct sockaddr{
  2.     sa_family_t sa_family;       通用的地址,协议族
  3.     char sa_data[14];            
  4. }
这个用来IPv4地址类型:
  1. struct sockaddr_in{
  2.     short int sin_family;
  3.     unsigned short int sin_port;
  4.     struct in_addr sin_addr;
  5.     unsigned char sin_zero[8];
  6. }
  7. struct in_addr{
  8.     unsigned long s_addr;
  9. }

三、地址转换
地址转化:inet_addr  将字符串形式的IP地址转化为整数型的IP地址(网络字节序
函数原型:in_addr_t inet_addr(const char *cp);
头文件:sys/socket.h netinet/in.h  arpa/inet.h
成功:返回0 失败:-1
sockfd:socket文件描述符
addr:socket的结构地址
addrlen:地址的长度

地址转化(反): innet_ntoa
函数原型: char *inet_ntoa(struct in_addr in);
头文件:sys/socket.h netinet/in.h arpa/inet.h
成功:返回字符串 
in:需要转换的in_addr结构的地址

四、网络字节序
如果两台设备进行通信,一台是小端模式的,一台是大端模式的。那么如果没有统一的结构,小端发送的字节序列通过网络发送到大端后,再有大端设备读取出来可能内容有偏差。
网络上传输的都是用大端模式的

uint32_t htonl(uint32_t hostlong);
将32位的数据从主机字节序转换为网络字节序 in_addr.saddr = htonl(INADDR_ANY)
uint16_t htons(uint16_t hostshort);
将16位的数据从主机字节序转换为网络字节序
uint32_t ntohl(uint32_t netlong);
将32位的数据从网络字节序转换为主机字节序
uint16_t ntohs(uint16_t netshort);
将16位的数据从网络字节序转换为主机字节序

五、TCP通讯程序设计
tcp_server.c:
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <strings.h>
  5. //#include <netinet/in.h>
  6. #include <arpa/inet.h>

  7. #define portnum 3333

  8. int main()
  9. {
  10.     int sockfd;
  11.     int new_fd;
  12.     struct sockaddr_in server_addr;
  13.     struct sockaddr_in client_addr;
  14.     char buffer[128];
  15.     int nbyte = 0;
  16.     int sin_size;

  17.     /*1.创建socket*/
  18.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  19.     {
  20.          printf("create socket error!\n");
  21.          exit(1);
  22.     }

  23.     /*2.1设置要绑定的地址*/
  24.     bzero(&server_addr, sizeof(struct sockaddr_in));
  25.     server_addr.sin_family = AF_INET;
  26.     server_addr.sin_port = htons(portnum);
  27.     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  28.     /*2.2.绑定地址*/
  29.     bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));

  30.     /*3.监听端口*/
  31.     listen(sockfd, 5);

  32.     while(1)
  33.     {
  34.     /*4.等待链接*/
  35.         sin_size = sizeof(struct sockaddr);
  36.         new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
  37.         if(new_fd == -1)
  38.         {
  39.             printf("accept socket failed\n");
  40.             exit(1);
  41.         }
  42.         
  43.         printf("server get connection form %s\n", inet_ntoa(client_addr.sin_addr));
  44.         /*5.接收数据*/
  45.         nbyte = recv(new_fd, buffer, 128, 0);
  46.         buffer[nbyte] = '\0';
  47.         printf("server received : %s\n",buffer);
  48.     /*6.结束链接*/
  49.         close(new_fd);
  50.     }

  51.     close(sockfd);

  52.     return 0;
  53. }
tcp_client:
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <string.h>

  7. #define portnum 3333

  8. int main()
  9. {
  10.     struct sockaddr_in server_addr;
  11.     int sockfd;
  12.     char buffer[128];
  13.     /*1.创建socket*/
  14.     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  15.     {
  16.         printf("create socket error!\n");
  17.         exit(1);
  18.     }

  19.     /*2.1设置要绑定的地址*/
  20.     bzero(&server_addr, sizeof(struct sockaddr_in));
  21.     server_addr.sin_family = AF_INET;
  22.     server_addr.sin_port = htons(portnum);
  23.     server_addr.sin_addr.s_addr = inet_addr("192.168.1.110");
  24.  
  25.     /*2.链接服务器*/
  26.     if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1)
  27.     {
  28.         printf("connect error!\n");
  29.         exit(1);
  30.     }
  31.     /*3.发送数据到服务器*/
  32.     printf("please input char:\n");
  33.     fgets(buffer,128,stdin);
  34.     send(sockfd, buffer, strlen(buffer), 0);

  35.     /*4.结束连接*/
  36.     close(sockfd);
  37. }

六、UDP编程练习
udp_server.c:
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <strings.h>
  4. #include <arpa/inet.h>
  5. #include <stdio.h>
  6. #include <unistd.h>

  7. #define portnum 3333
  8. #define MSG_SIZE 128

  9. int main()
  10. {
  11.     int sockfd;
  12.     struct sockaddr_in server_addr;
  13.     struct sockaddr_in client_addr;
  14.     char buffer[MSG_SIZE];
  15.     int addrlen;
  16.     int n;
  17.     /*创建socket*/
  18.     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  19.     {
  20.         printf("create socket error!\n");
  21.     exit(1);
  22.     }
  23.     
  24.     bzero(&server_addr, sizeof(struct sockaddr_in));
  25.     server_addr.sin_family = AF_INET;
  26.     server_addr.sin_port = htons(portnum);
  27.     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  28.     /*绑定地址*/
  29.     bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  30.     
  31.     /*接收数据*/
  32.     while(1)
  33.     {
  34.         addrlen = sizeof(struct sockaddr);
  35.     bzero(buffer, MSG_SIZE);
  36.         n = recvfrom(sockfd, buffer, MSG_SIZE, 0, (struct sockaddr *)&client_addr, &addrlen);
  37.     buffer[n] = '\0';
  38.     printf("server received :%s\n", buffer);
  39.     }

  40.     /*结束连接*/
  41.     close(sockfd);
  42.     return 0;
  43. }
udp_client.c:
  1. #include <strings.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <strings.h>
  5. #include <stdio.h>
  6. #include <arpa/inet.h>

  7. #define portnum 3333
  8. #define BUF_SIZE 128

  9. int main(int argc, char *argv[])
  10. {
  11.     int sockfd;
  12.     char buffer[BUF_SIZE];
  13.     struct sockaddr_in server_addr;

  14.     if(argc != 2)
  15.     {
  16.         printf("Usage: ./udp_client [ip]\n");
  17.     exit(0);
  18.     }
  19.     /*创建socket*/
  20.     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  21.     {
  22.         printf("create socket failed!\n");
  23.         exit(1);
  24.     }

  25.     /*发送数据*/
  26.     bzero(&server_addr, sizeof(struct sockaddr_in));
  27.     server_addr.sin_family = AF_INET;
  28.     server_addr.sin_port = htons(portnum);
  29.     inet_aton(argv[1], &server_addr.sin_addr);

  30.     while(1)
  31.     {
  32.         printf("Please input char:\n");
  33.     fgets(buffer, BUF_SIZE, stdin);
  34.         sendto(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  35.     bzero(buffer, BUF_SIZE);
  36.     }
  37.     /*结束链接*/
  38.     close(sockfd);
  39. }


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