找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1030|回复: 0
收起左侧

SOkit的C语言源程序

[复制链接]
ID:575265 发表于 2019-6-30 22:25 | 显示全部楼层 |阅读模式
有用的sokit
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. #include<netdb.h>
  6. #include<sys/types.h>
  7. #include<netinet/in.h>
  8. #include<sys/socket.h>
  9. #define PORT 4321
  10. #define BUF_SIZE 1024
  11. int main(int argc, char *argv[])
  12. {
  13. int sockfd, sendbytes, recvbytes;
  14. char buf[BUF_SIZE];
  15. struct hostent *host;
  16. struct sockaddr_in serv_addr;
  17. if(argc<2)
  18. {// 检查程序参数个
  19. printf("USAGE: ./tclient Hostname(or ip address)\n");
  20. exit(1);
  21. }
  22. //检查程序参数指定的服务器地止
  23. if((host = gethostbyname(argv[1])) == NULL)
  24. {
  25. perror("gethostbyname");
  26. exit(1);
  27. }
  28. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  29. {// 创建一个流
  30. socket perror("socket");
  31. exit(1);
  32. }
  33. //初始化serv_addr结构体变
  34. serv_addr.sin_family = AF_INET;
  35. serv_addr.sin_port=htons(PORT);
  36. serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
  37. bzero(&(serv_addr.sin_zero), 8);
  38. // 连接服务
  39. if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
  40. {perror("connect");
  41. exit(1);
  42. }// 显示连接信
  43. printf("connect to server %s...\nInput the msg to send:\n", argv[1]);
  44. while (1)
  45. { // 循环发送、接收服务器信
  46. bzero(buf, sizeof(buf));// 清空缓
  47. if(fgets(buf, BUF_SIZE, stdin)) {
  48. // 终端输入一行数据
  49. if (strcmp(buf, "exit\n") == 0) break;// 判断是否退出循
  50. if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
  51. { // 是否发送成功
  52. perror("send");
  53. exit(1);
  54. }
  55. }
  56. bzero(buf, sizeof(buf));// 清空缓冲
  57. if((recvbytes = recv(sockfd, buf, BUF_SIZE, 0)) == -1)
  58. {
  59. // 等待接收数据
  60. perror("recv");
  61. exit(1);
  62. }
  63. else printf("receive from %d(socket): %s\n", sockfd, buf); // 打印接收数据 }
  64. close(sockfd);// 关闭
  65. socket return 0;
  66. }


  67. #include<stdio.h>
  68. #include<stdlib.h>
  69. #include<unistd.h>
  70. #include<sys/types.h>
  71. #include<sys/stat.h>
  72. #include<string.h>
  73. #include<sys/socket.h>
  74. #include<netinet/in.h>
  75. #include<netdb.h>
  76. #include<time.h>
  77. #include <string.h>
  78. #include <sys/ioctl.h>
  79. #include <arpa/inet.h>
  80. #define PORT 4321
  81. #define MAX_QUE_CONN_NM 5
  82. #define MAX_SOCK_FD FD_SETSIZE
  83. #define BUFFER_SIZE 1024
  84. #define HOSTLEN 256
  85. int main()
  86. {
  87. struct sockaddr_in  server_sockaddr, client_sockaddr;
  88. int sin_size, count;
  89. fd_set inset, tmp_inset;
  90. int sockfd, client_fd, fd;
  91. char buf[BUFFER_SIZE];
  92. // 接收、发送缓
  93. struct sockaddr_in scinf[100];
  94. // 客户端地址池
  95. bzero((void *)scinf, sizeof(scinf));
  96. // 创建
  97. socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  98. {
  99. perror("socket");
  100. exit(1);
  101. }
  102. // 初始化服务器地址结构体
  103. server_sockaddr.sin_family=AF_INET;
  104. server_sockaddr.sin_port=htons(PORT);
  105. server_sockaddr.sin_addr.s_addr = INADDR_ANY;
  106. bzero(&(server_sockaddr.sin_zero), 8);
  107. // 为bind设置地址复用
  108. int i = 1;
  109. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
  110. if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))==-1)
  111. {
  112. perror("bind");
  113. exit(1);
  114. }
  115. // 开始侦听客户端连
  116. if(listen(sockfd, MAX_QUE_CONN_NM) == -1)
  117. {
  118. perror("listen");
  119. exit(1);
  120. }
  121. printf("Begin listening...\n");
  122. // 准备非阻塞方式连接多路客户端
  123. FD_ZERO(&inset);
  124. FD_SET(sockfd, &inset);
  125. while (1)
  126. {
  127. tmp_inset = inset;
  128. sin_size = sizeof(struct sockaddr_in);
  129. memset(buf, 0, sizeof(buf));
  130. if(!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
  131. {//等待网络消息
  132. perror("select");
  133. exit(1);
  134. }
  135. for(fd = 0; fd < MAX_SOCK_FD; ++fd)
  136. {
  137. if (FD_ISSET(fd, &tmp_inset) > 0)
  138. {
  139. if (fd == sockfd)
  140. {// 有客户端连接请求,accept
  141. if((client_fd = accept(sockfd, (struct sockaddr*)&client_sockaddr, &sin_size))==-1)
  142. {
  143. perror("accept");
  144. exit(1);
  145. }
  146. FD_SET(client_fd, &inset);
  147. printf("New connection from %s\n", inet_ntoa(client_sockaddr.sin_addr));
  148. if(client_fd < 100 && client_fd >= 0)// 新连接客户端记入地址
  149. memcpy((void *)(&scinf[client_fd]), (void *)&client_sockaddr, sin_size);
  150. }
  151. ellse
  152. {
  153. // 有客户端数据
  154. if((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
  155. {// 接收数
  156. if(fd >= 0 && fd < 100)
  157. printf("Received from %s:\t%s\n", inet_ntoa(scinf[fd].sin_addr), buf);
  158. if((count = send(fd, buf, strlen(buf), 0)) == -1)
  159. { // 回送数据
  160. perror("send");
  161. exit(1);
  162. }
  163. }
  164. else
  165. {// 无法读取数据,可能连接以断
  166. if(fd >= 0 && fd < 100)
  167. printf("Client %s has left\n", inet_ntoa(scinf[fd].sin_addr));
  168. memset((void *)(&scinf[client_fd]), 0, sin_size);
  169. close(fd);
  170. FD_CLR(fd, &inset);
  171. }
  172. }
  173. }
  174. }
  175. }
  176. close(sockfd); return 0;
  177. }
复制代码


sokit.zip

3.9 MB, 下载次数: 4, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表