当前位置 : 主页 > 编程语言 > c++ >

C/C++网络编程1——linux实现

来源:互联网 收集:自由互联 发布时间:2021-06-23
网络编程就是编写程序使两台联网的计算机相互交换数据。 例子:服务器端开启一个socket,监听9999端口。客户端向服务器端发起请求,服务器端收到请求以后,给客户端发送一句:"

  网络编程就是编写程序使两台联网的计算机相互交换数据。

 

 例子:服务器端开启一个socket,监听9999端口。客户端向服务器端发起请求,服务器端收到请求以后,给客户端发送一句:"hello world";

服务器端:

  step1:调用socket函数创建套接字。

  step2:调用bind函数分配ip和端口号。

  step3:调用listen函数转为可接受请求状态。

  step4:调用accept函数受理连接请求。

 1 #include <unistd.h>
 2 #include <iostream>
 3 #include <string>
 4 #include <cstdlib>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 using namespace std;
 9 
10 int main()
11 {
12     int serv_sock = socket(PF_INET, SOCK_STREAM, 0);
13     if (serv_sock == -1) {
14         cout << "socket() error" << endl;
15         return 0;
16     }
17 
18     sockaddr_in serv_addr;
19     serv_addr.sin_family = AF_INET;
20     serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
21     serv_addr.sin_port = htons(9999);
22 
23     if (bind(serv_sock, (sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) {
24         cout << "bind() error" << endl;
25         close(serv_sock);
26         return 0;
27     }
28 
29     if (listen(serv_sock, 5) == -1) {
30         cout << "listen() error" << endl;
31         close(serv_sock);
32         return 0;
33     }
34 
35     sockaddr_in clnt_addr;
36     socklen_t clnt_add_size = sizeof(clnt_addr);
37     cout << "start listen" << endl;
38     int clnt_sock = accept(serv_sock, (sockaddr*) &clnt_addr, &clnt_add_size);
39     if (clnt_sock == -1) {
40         cout << "accept() error" << endl;
41         close(clnt_sock);
42         close(serv_sock);
43         return 0;
44     }
45 
46     string message = "hello world";
47     write(clnt_sock, message.c_str(), message.size());
48 
49     close(clnt_sock);
50     close(serv_sock);
51 
52     return 0;
53 }

 

客户端:

  step1:调用socket函数创建套接字。

  step2:调用connect函数想服务器端发送连接请求。

 1 #include <unistd.h>
 2 #include <iostream>
 3 #include <string>
 4 #include <cstdlib>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 using namespace std;
 9 
10 int main()
11 {
12     int clnt_sock = socket(PF_INET, SOCK_STREAM, 0);
13     if (clnt_sock == -1) {
14         cout << "socket() error" << endl;
15         return 0;
16     }
17 
18     sockaddr_in serv_addr;
19     serv_addr.sin_family = AF_INET;
20     serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
21     serv_addr.sin_port = htons(9999);
22 
23     if (connect(clnt_sock, (sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) {
24         cout << "connect() error" << endl;
25         close(clnt_sock);
26         return 0;
27     }
28 
29     char message[100];
30     int str_len = read(clnt_sock, message, sizeof(message)-1);
31     if (str_len == -1) {
32         cout << "read failed" << endl;
33         close(clnt_sock);
34         return 0;
35     }
36 
37     cout << message << endl;
38     close(clnt_sock);
39     return 0;
40 }

   示例中用到了write和read函数,linux中一切都被看作文件,所以套接字也可以像操作文件一样去操作。

网友评论