运行截图:
客户端
- 创建通信套接字
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 }