97.TCP通信

运行截图:

客户端

  • 创建通信套接字
1 //通信套接字,用于创建TCP连接
2     SOCKET socket_send;
  • 创建tcp通信
    1 //创建tcp通信
    2     socket_send = socket(AF_INET, SOCK_STREAM, 0);
  • 创建服务器端结构体保存ip地址以及端口号,用于连接服务器
    1 //创建服务器端结构体保存ip地址以及端口号
    2     SOCKADDR_IN sever_addr;
  • 设置通信模式
    1 //设置通信模式
    2     sever_addr.sin_family = AF_INET;
    3     sever_addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
    4     //端口
    5     sever_addr.sin_port = htons(9982);
  • 通过套接字连接服务器
    1     //通过套接字连接到服务器
    2     connect(socket_send, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));

    连接到服务器后就可以对服务器进行发送或者接受数据

  • 通过套接字发送信息
    1 sendlength = send(socket_send, sendbuf, 256, 0);
  • 通过套接字接收信息
    1 receivelength = recv(socket_send, receivebuf, 256, 0);
  • 关闭网络
    1 //关闭网络
    2     closesocket(socket_send);
    3     WSACleanup();//关闭

客户端完整代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 //网络通信
 6 #include<winsock.h>
 7 #pragma  comment(lib,"ws2_32.lib")
 8 
 9 void main()
10 {
11     //发送的消息
12     char sendbuf[256] = { 0 };
13     //收到的消息
14     char receivebuf[256] = { 0 };
15     //发送的长度
16     int sendlength = 0;
17     //接收的长度
18     int receivelength = 0;
19     
20     //通信套接字,用于创建TCP连接
21     SOCKET socket_send;
22     //创建服务器端结构体保存ip地址以及端口号
23     SOCKADDR_IN sever_addr;
24 
25     //版本,2,2版本
26     WORD wversion = MAKEWORD(2, 2);
27     //版本
28     WSADATA wsadata;
29     //获取版本对比,开始通信
30     int error = WSAStartup(wversion, &wsadata);
31     if (error != 0)
32     {
33         printf("error");
34         return;
35     }
36     //取出低八位,高八位,对比版本
37     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
38     {
39         printf(" version  error");
40         return;
41     }
42     //设置通信模式
43     sever_addr.sin_family = AF_INET;
44     sever_addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
45     //端口
46     sever_addr.sin_port = htons(9982);
47 
48     //创建tcp通信
49     socket_send = socket(AF_INET, SOCK_STREAM, 0);
50 
51     //通过套接字连接到服务器
52     connect(socket_send, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));
53 
54     while (1)
55     {
56         printf("客户端要说什么:");
57         scanf("%s", sendbuf);
58         //通过套接字发送到服务器
59         sendlength = send(socket_send, sendbuf, 256, 0);
60         memset(receivebuf, 0, 256);//清零
61 
62         //通过套接字接收
63         receivelength = recv(socket_send, receivebuf, 256, 0);
64         printf("服务器说:%s
", receivebuf);
65         memset(sendbuf, 0, 256);//清零
66 
67     }
68     //关闭网络
69     closesocket(socket_send);
70     WSACleanup();//关闭
71 }

服务器端

  • 创建服务器套接字
    1 //服务器套接字
    2     SOCKET socket_server;
  • 创建tcp通信
    1 //创建服务器套接字,接受消息  SOCK_STREAM流
    2     socket_server = socket(AF_INET, SOCK_STREAM, 0);//创建
  • 创建服务器端结构体保存ip地址以及端口号
    1 //服务器结构体信息
    2     SOCKADDR_IN sever_addr;
  • 设置服务器结构体信息
    1 //设置服务器结构体信息
    2     sever_addr.sin_family = AF_INET;//通信
    3     sever_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//获取本地址
    4     sever_addr.sin_port = htons(9982);//端口
  • 把服务器结构体和服务器套接字绑定
    1 //把套接字与服务器结构体绑定 (绑定的是地址,端口)
    2     bind(socket_server, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));
  • 服务器套接字监听
    1 //服务器套接字监听
    2     listen(socket_server, 5);//最大等待数目为5
  • 获取SOCKADDR结构体大小用于接受连接
    1 length = sizeof(SOCKADDR);
  • 通过服务器套接字接受连接并初始化套接字sorket_receive,把连接者的信息存放在结构体client_addr中
    1 //客户端结构体信息
    2     SOCKADDR_IN client_addr;
  • 1 sorket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length);
  • 通过套接字sorket_receive向客户端接受或发送消息
     1 //接收数据
     2         receivelength = recv(sorket_receive, receivebuf, 256, 0);
     3         printf("客户端说:%s
    ", receivebuf);
     4         memset(receivebuf, 0, 256);//清零
     5 
     6 
     7         //返回发送数据
     8         printf("服务器要说什么:");
     9         //接收信息
    10         scanf("%s", sendbuf);
    11         //通过连接传递消息到连接
    12         sendlength = send(sorket_receive, sendbuf, 256, 0);
    13         memset(sendbuf, 0, 256);//清零
  • 释放网络
    1 //释放网络
    2     closesocket(sorket_receive);//关闭网络
    3     closesocket(socket_server);
    4     WSACleanup();//关闭

服务器端完整代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 //网络通信
 6 #include<winsock.h>
 7 #pragma  comment(lib,"ws2_32.lib")
 8 
 9 void main()
10 {
11     //发送的消息
12     char sendbuf[256] = { 0 };
13     //收到的消息
14     char receivebuf[256] = { 0 };
15     //发送的长度
16     int sendlength = 0;
17     //收到的长度
18     int receivelength = 0;
19     // SOCKADDR结构体长度
20     int length;
21 
22     //服务器套接字
23     SOCKET socket_server;
24     //连接的套接字
25     SOCKET sorket_receive;
26 
27     //服务器结构体信息
28     SOCKADDR_IN sever_addr;
29     //客户端结构体信息
30     SOCKADDR_IN client_addr;
31 
32     //版本,2,2版本
33     WORD wversion = MAKEWORD(2, 2);
34     //当前版本
35     WSADATA wsadata;
36     //获取版本对比,开始通信
37     int error = WSAStartup(wversion, &wsadata);
38     if (error != 0)
39     {
40         printf("error");
41         return;
42     }
43     //取出低八位,高八位,对比版本
44     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
45     {
46         printf(" version  error");
47         return;
48     }
49 
50     //设置服务器结构体信息
51     sever_addr.sin_family = AF_INET;//通信
52     sever_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//获取本地址
53     sever_addr.sin_port = htons(9982);//端口
54 
55     //创建服务器套接字,接受消息  SOCK_STREAM流
56     socket_server = socket(AF_INET, SOCK_STREAM, 0);//创建
57     //把套接字与服务器结构体绑定 (绑定的是地址,端口)
58     bind(socket_server, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));
59     //服务器套接字监听
60     listen(socket_server, 5);//最大等待数目为5
61     length = sizeof(SOCKADDR);
62     //通过服务器套接字接受连接,初始化套接字sorket_receive,把连接者的信息存放在结构体client_addr中
63     sorket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length);
64 
65     while (1)
66     {
67         //接收数据
68         receivelength = recv(sorket_receive, receivebuf, 256, 0);
69         printf("客户端说:%s
", receivebuf);
70         memset(receivebuf, 0, 256);//清零
71 
72 
73         //返回发送数据
74         printf("服务器要说什么:");
75         //接收信息
76         scanf("%s", sendbuf);
77         //通过连接传递消息到连接
78         sendlength = send(sorket_receive, sendbuf, 256, 0);
79         memset(sendbuf, 0, 256);//清零
80     }
81 
82     //释放网络
83     closesocket(sorket_receive);//关闭网络
84     closesocket(socket_server);
85     WSACleanup();//关闭
86     system("pause");
87 }
原文地址:https://www.cnblogs.com/xiaochi/p/8468466.html