基于CS模型简单的 socket例子.docx
- 文档编号:29356999
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:14
- 大小:19.57KB
基于CS模型简单的 socket例子.docx
《基于CS模型简单的 socket例子.docx》由会员分享,可在线阅读,更多相关《基于CS模型简单的 socket例子.docx(14页珍藏版)》请在冰豆网上搜索。
基于CS模型简单的socket例子
从一个简单的基于C/S模型的TCPsocket编程案例,其基本步骤如下:
server client
+++++++ ++++++++
创建socket 创建socket
+++++++ ++++++++
| |
| |
| |
+++++++ ++++++++
地址赋值( 地址赋值(
自己的地址) 服务器地址)
+++++++ ++++++++
| |
| |
| |
++++++++ |
用bind绑定 |
socket和地址 |
++++++++ |
| |
| |
| |
+++++++ |
listen |
+++++++ |
| ++++++++++
| <------------------------------ connect服务器
| ++++++++++
+++++++ |
accept |
+++++++ |
| |
| +++++++++
| recv和send
| 进行数据处理
| +++++++++
+++++++++ |
用accept得到 |
的socket进行 |
recv和send |
+++++++++ |
| |
| |
| |
+++++++++ +++++++++
closesocket closesocket
+++++++++ +++++++++
根据以上步骤,服务器端的代码为
[cpp] viewplaincopy
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#define MAX_LISTEN_NUM 5
9.#define SEND_BUF_SIZE 100
10.#define RECV_BUF_SIZE 100
11.#define LISTEN_PORT 1010
12.int main()
13.{
14. int listen_sock = 0;
15. int app_sock = 0;
16. struct sockaddr_in hostaddr;
17. struct sockaddr_in clientaddr;
18. int socklen = sizeof(clientaddr);
19. char sendbuf[SEND_BUF_SIZE] = {0};
20. char recvbuf[RECV_BUF_SIZE] = {0};
21. int sendlen = 0;
22. int recvlen = 0;
23. int retlen = 0;
24. int leftlen = 0;
25. char *ptr = NULL;
26. memset((void *)&hostaddr, 0, sizeof(hostaddr));
27. memset((void *)&clientaddr, 0, sizeof(clientaddr));
28. hostaddr.sin_family = AF_INET;
29. hostaddr.sin_port = htons(LISTEN_PORT);
30. hostaddr.sin_addr.s_addr = htonl(INADDR_ANY);
31. listen_sock = socket(AF_INET, SOCK_STREAM, 0);
32. if(listen_sock < 0)
33. {
34. syslog(LOG_ERR, "%s:
%d, create socket failed", __FILE__, __LINE__);
35. exit
(1);
36. }
37. if(bind(listen_sock, (struct sockaddr *)&hostaddr, sizeof(hostaddr)) < 0)
38. {
39. syslog(LOG_ERR, "%s:
%d, bind socket failed", __FILE__, __LINE__);
40. exit
(1);
41. }
42. if(listen(listen_sock, MAX_LISTEN_NUM) < 0)
43. {
44. syslog(LOG_ERR, "%s:
%d, listen failed", __FILE__, __LINE__);
45. exit
(1);
46. }
47. while
(1)
48. {
49. app_sock = accept(listen_sock, (struct sockaddr *)&clientaddr, &socklen);
50. if(app_sock < 0)
51. {
52. syslog(LOG_ERR, "%s:
%d, accept failed", __FILE__, __LINE__);
53. exit
(1);
54. }
55. sprintf(sendbuf, "welcome %s:
%d here!
/n", inet_ntoa(clientaddr.sin_addr.s_addr), clientaddr.sin_port);
56. //send data
57. sendlen = strlen(sendbuf) +1;
58. retlen = 0;
59. leftlen = sendlen;
60. ptr = sendbuf;
61. //while(leftlen)
62. {
63. retlen = send(app_sock, ptr, sendlen, 0);
64. if(retlen < 0)
65. {
66. if(errno == EINTR)
67. retlen = 0;
68. else
69. exit
(1);
70. }
71. leftlen -= retlen;
72. ptr += retlen;
73. }
74. //receive data
75. recvlen = 0;
76. retlen = 0;
77. ptr = recvbuf;
78. leftlen = RECV_BUF_SIZE -1;
79. //do
80. {
81. retlen = recv(app_sock, ptr, leftlen, 0) ;
82. if(retlen < 0)
83. {
84. if(errno == EINTR)
85. retlen = 0;
86. else
87. exit
(1);
88. }
89. recvlen += retlen;
90. leftlen -= retlen;
91. ptr += retlen;
92. }
93. //while(recvlen && leftlen);
94. printf("receive data is :
%s", recvbuf);
95. close(app_sock);
96. }
97. close(listen_sock);
98.
99. return 0;
100.
101.
102.}
客户端代码为:
[cpp] viewplaincopy
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#define MAX_LISTEN_NUM 5
9.#define SEND_BUF_SIZE 100
10.#define RECV_BUF_SIZE 100
11.#define SERVER_PORT 1010
12.int main()
13.{
14. int sock_fd = 0;
15. char recvbuf[RECV_BUF_SIZE] = {0};
16. char sendbuf[SEND_BUF_SIZE] = {0};
17. int recvlen = 0;
18. int retlen = 0;
19. int sendlen = 0;
20. int leftlen = 0;
21. char *ptr = NULL;
22. struct sockaddr_in ser_addr;
23.
24. memset(&ser_addr, 0, sizeof(ser_addr));
25. ser_addr.sin_family = AF_INET;
26. inet_aton("127.0.0.1", (struct in_addr *)&ser_addr.sin_addr);
27. ser_addr.sin_port = htons(SERVER_PORT);
28. sock_fd = socket(AF_INET, SOCK_STREAM, 0);
29. if(sock_fd < 0)
30. {
31. syslog(LOG_ERR, "%s:
%d, create socket failed", __FILE__, __LINE__);
32. exit
(1);
33. }
34. if(connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) < 0)
35. {
36. syslog(LOG_ERR, "%s:
%d, connect socket failed", __FILE__, __LINE__);
37. exit
(1);
38. }
39. //receive data
40. recvlen = 0;
41. retlen = 0;
42. ptr = recvbuf;
43. leftlen = RECV_BUF_SIZE -1;
44. //do
45. {
46. retlen = recv(sock_fd, ptr, leftlen, 0) ;
47. if(retlen < 0)
48. {
49. if(errno == EINTR)
50. retlen = 0;
51. else
52. exit
(1);
53. }
54. recvlen += retlen;
55. leftlen -= retlen;
56. ptr += retlen;
57. }
58. //while(recvlen && leftlen);
59. printf("receive data is :
%s", recvbuf);
60. sprintf(sendbuf, "hello server/n");
61. //send data
62. sendlen = strlen(sendbuf) +1;
63. retlen = 0;
64. leftlen = sendlen;
65. ptr = sendbuf;
66. // while(leftlen)
67. {
68. retlen = send(sock_fd, ptr, sendlen, 0);
69. if(retlen < 0)
70. {
71. if(errno == EINTR)
72. retlen = 0;
73. else
74. exit
(1);
75. }
76. leftlen -= retlen;
77. ptr += retlen;
78. }
79. close(sock_fd);
80.
81.}
现在一个简单的使用tcp的socket通信的例子已经完成了,这里有几个需要说明的问题
1)头文件:
sys/socket.h 包含了socket相关的函数,如socket,send和recv,以及structsockaddr等
netinet/in.h 包含了地址结构,如structsockaddr_in
errno.h 包含了errno和EINTR
syslog.h 包含了syslog相关的信息,其打印结果在/var/log/messages里面
2)socket地址
对于IPv4来说,其地址用的是structsockaddr_in,具体结构如下
[cpp]viewplaincopy
1.struct in_addr {
2. in_addr_t s_addr; /* 32-bit IPv4 address */
3. /* network byte ordered */
4.};
5.
6.struct sockaddr_in {
7. uint8_t sin_len; /* length of structure (16) */
8. sa_family_t sin_family; /* AF_INET */
9. in_port_t sin_port; /* 16-bit TCP or UDP port number */
10. /* network byte ordered */
11. struct in_addr sin_addr; /* 32-bit IPv4 address */
12. /* network byte ordered */
13. char sin_zero[8]; /* unused */
14.};
其中sin_len我们一般不关注,也不填(只有在使用routingsocket的时候才用到,被内核用来处理各种协议簇的地址结构)。
bind,connect,sendto,和sendmsg会把socket地址从程序传递给内核;而accept,recvfrom,recvmsg,getpeername,和getsockname会把地址从内核传递给程序。
因为不同协议簇的地址结构是不一样的,所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于CS模型简单的 socket例子 基于 CS 模型 简单 socket 例子
![提示](https://static.bdocx.com/images/bang_tan.gif)