TCP Server端
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include <malloc.h>#pragma comment(lib,"ws2_32.lib")int main()
{//启动Windows socket 2.x环境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立简易TCP服务端// 1 建立一个socket 套接字SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 2 bind 绑定用于接受客户端连接的网络端口sockaddr_in _sin = {};_sin.sin_family = AF_INET;_sin.sin_port = htons(4567);//host to net unsigned short_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin))){printf("错误,绑定网络端口失败...\n");}else {printf("绑定网络端口成功...\n");}// 3 listen 监听网络端口if (SOCKET_ERROR == listen(_sock, 5)){printf("错误,监听网络端口失败...\n");}else {printf("监听网络端口成功...\n");}// 4 accept 等待接受客户端连接sockaddr_in clientAddr = {};int nAddrLen = sizeof(sockaddr_in);SOCKET _cSock = INVALID_SOCKET;char msgBuf[] = "Hello, I'm Server.";while (true){_cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);if (INVALID_SOCKET == _cSock){printf("错误,接受到无效客户端SOCKET...\n");}printf("新客户端加入:IP = %s \n", inet_ntoa(clientAddr.sin_addr));// 5 send 向客户端发送一条数据FILE *fp1 = NULL; //指向源文件char *byBuff = NULL; //缓存int fileBytes = 0; //文件大小const char* pSrc = "Src.mp4";if ((fp1 = fopen(pSrc, "rb")) != NULL){fseek(fp1, 0L, 2);//将文件指针移动到文件末尾size_t size = ftell(fp1);//计算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//动态分配一块空间来存储读到的数据fseek(fp1, 0L, 0);//将文件指针移动到文件头部fileBytes = fread(byBuff, 1, size, fp1);send(_cSock, byBuff, size, 0);memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}}// 6 关闭套节字closesocketclosesocket(_sock);//------------//清除Windows socket环境WSACleanup();return 0;
}
TCP Client端
#define WIN32_LEAN_AND_MEAN#include<windows.h>
#include<WinSock2.h>
#include<stdio.h>
#include<malloc.h>#pragma comment(lib,"ws2_32.lib")int main()
{//启动Windows socket 2.x环境WORD ver = MAKEWORD(2, 2);WSADATA dat;WSAStartup(ver, &dat);//------------//-- 用Socket API建立简易TCP客户端// 1 建立一个socketSOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);if (INVALID_SOCKET == _sock){printf("错误,建立Socket失败...\n");}else {printf("建立Socket成功...\n");}// 2 连接服务器 connectsockaddr_in _sin = {};_sin.sin_family = AF_INET;_sin.sin_port = htons(4567);_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int ret = connect(_sock, (sockaddr*)&_sin, sizeof(sockaddr_in));if (SOCKET_ERROR == ret){printf("错误,连接服务器失败...\n");}else {printf("连接服务器成功...\n");}// 3 接收服务器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.MP4";char *byBuff = NULL; //缓存byBuff = (char*)malloc(691767);//动态分配一块空间来存储读到的数据int nlen = recv(_sock, byBuff, 691767, 0);if ((fp1 = fopen(pDest, "ab+")) != NULL){fwrite(byBuff, 691767, 1, fp1);//从数据存储区向外读数据memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}if (nlen > 0){printf("接收到数据\n");}// 4 关闭套节字closesocketclosesocket(_sock);//清除Windows socket环境WSACleanup();getchar();return 0;
}
UDP 服务端
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h> #pragma comment(lib,"ws2_32.lib")
#define PORT 2345 int main(int argc, char* argv[])
{//Step1:初始化网络环境 WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一个UDP的socket //建立socket参数:socket(协议域,指定socket类型,指定协议)(和TCP协议后两个参数不同,都为IP协议族)SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sock == SOCKET_ERROR){printf("create socket failed\n");return -1;}//Step3:绑定地址信息 sockaddr_in serverAddr;serverAddr.sin_family = AF_INET; // 协议簇为IPV4的 serverAddr.sin_port = htons(PORT); // 端口 因为本机是小端模式,网络是大端模式,调用htons把本机字节序转为网络字节序 serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // ip地址,INADDR_ANY表示绑定电脑上所有网卡IP //bind(socket描述字, 绑定给listenfd的协议地址,地址长度)bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));//Step5:与客户端进行通信char buf[512];while (TRUE){memset(buf, 0, 512);// 网络节点的信息,用来保存客户端的网络信息 sockaddr_in clientAddr;memset(&clientAddr, 0, sizeof(sockaddr_in));int clientAddrLen = sizeof(sockaddr);//接收客户端发来的数据 //recvfrom参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址//sockaddr地址用来保存从哪里发来,和发送到哪里的地址信息int ret = recvfrom(sock, buf, 512, 0, (sockaddr*)&clientAddr, &clientAddrLen);//inet_ntoa函数转化为ip,ntohs函数转化为端口号printf("Recv msg:%s from IP:[%s] Port:[%d]\n", buf, inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));FILE *fp1 = NULL; //指向源文件char *byBuff = NULL; //缓存int fileBytes = 0; //文件大小const char* pSrc = "rgb24_fmt.jfif";if ((fp1 = fopen(pSrc, "rb")) != NULL){fseek(fp1, 0L, 2);//将文件指针移动到文件末尾size_t size = ftell(fp1);//计算文件大小printf("文件大小%d \n", size);byBuff = (char*)malloc(size);//动态分配一块空间来存储读到的数据fseek(fp1, 0L, 0);//将文件指针移动到文件头部fileBytes = fread(byBuff, 1, size, fp1);// 发一个数据包返回给客户 //sendto参数:socket名称,发送数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址sendto(sock, byBuff, fileBytes, 0, (sockaddr*)&clientAddr, clientAddrLen);printf("Send msg back to IP:[%s] Port:[%d]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}}return 0;
}
UDP 客户端
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h> #pragma comment(lib,"ws2_32.lib")
#define PORT 2345
int main(int argc, char* argv[])
{//Step1:初始化网络环境 WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("WSAStartup failed\n");return -1;}//Step2:建立一个UDP的socket //建立socket参数:socket(协议域,指定socket类型,指定协议)(和TCP协议后两个参数不同,都为IP协议族)SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sockClient == INVALID_SOCKET){printf("create socket failed\n");return -1;}// 申明一个网络地址信息的结构体,保存服务器的地址信息 sockaddr_in addr = { 0 };addr.sin_family = AF_INET; // 协议簇为IPV4的 addr.sin_port = htons(PORT); // 端口 因为本机是小端模式,网络是大端模式,调用htons把本机字节序转为网络字节序 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 服务器的ip地址//Step3:与服务端进行通信char buf[] = "client test!";//发送数据 //sendto参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));if (dwSent == 0){printf("send %s failed\n", buf);return -1;}printf("send msg:%s\n", buf);char recvBuf[512];memset(recvBuf, 0, 512);sockaddr_in addrSever = { 0 };int nServerAddrLen = sizeof(sockaddr_in);// 3 接收服务器信息 recvFILE *fp1 = NULL; //指向源文件const char* pDest = "Dest.jfif";char *byBuff = NULL; //缓存byBuff = (char*)malloc(2908);//动态分配一块空间来存储读到的数据// 接收数据 //recvfrom参数:socket名称,接收数据的缓冲区,缓冲区大小,标志位(调用操作方式),sockaddr结构地址,sockaddr结构大小地址int dwRecv = recvfrom(sockClient, byBuff, 2908, 0, (SOCKADDR *)&addrSever, &nServerAddrLen);if ((fp1 = fopen(pDest, "ab+")) != NULL){printf("Recv data\n");fwrite(byBuff, 2908, 1, fp1);//从数据存储区向外读数据memset(byBuff, 0, sizeof(byBuff));//存储区清空fclose(fp1);}//Step4:关闭SOCKET连接 closesocket(sockClient);//清理网络环境 WSACleanup();system("pause");return 0;
}