Socket通信

简介: Socket通信

UDP通信

先启动server再启动client

//server
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 100
int main(){
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //创建套接字
  SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
  //绑定套接字
  struct sockaddr_in servAddr;
  memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充
  servAddr.sin_family = PF_INET;  //使用IPv4地址
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址
  servAddr.sin_port = htons(1234);  //端口
  bind(sock, (SOCKADDR*)&servAddr, sizeof(SOCKADDR));
  //接收客户端请求
  SOCKADDR clntAddr;  //客户端地址信息
  int nSize = sizeof(SOCKADDR);
  char buffer[BUF_SIZE];  //缓冲区
  while (1){
    int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &clntAddr, &nSize);
    sendto(sock, buffer, strLen, 0, &clntAddr, nSize);
  }
  closesocket(sock);
  WSACleanup();
  return 0;
}
//client
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 100
int main(){
  //初始化DLL
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //创建套接字
  SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);
  //服务器地址信息
  struct sockaddr_in servAddr;
  memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充
  servAddr.sin_family = PF_INET;
  servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  servAddr.sin_port = htons(1234);
  //不断获取用户输入并发送给服务器,然后接受服务器数据
  struct sockaddr fromAddr;
  int addrLen = sizeof(fromAddr);
  while (1){
    char buffer[BUF_SIZE] = { 0 };
    printf("Input a string: ");
    gets(buffer);
    sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));
    int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &fromAddr, &addrLen);
    buffer[strLen] = 0;
    printf("Message form server: %s\n", buffer);
  }
  closesocket(sock);
  WSACleanup();
  return 0;
}


b6c7cfd4b3e54be481f93673ee4cc32b.png

先启动server再启动client

//server
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 1024
int main(){
  //先检查文件是否存在
  char *filename = "D:\\OpenFlow.docx";  //文件名
  FILE *fp = fopen(filename, "rb");  //以二进制方式打开文件
  if (fp == NULL){
    printf("Cannot open file, press any key to exit!\n");
    system("pause");
    exit(0);
  }
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);
  struct sockaddr_in sockAddr;
  memset(&sockAddr, 0, sizeof(sockAddr));
  sockAddr.sin_family = PF_INET;
  sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  sockAddr.sin_port = htons(1234);
  bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
  listen(servSock, 20);
  SOCKADDR clntAddr;
  int nSize = sizeof(SOCKADDR);
  SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
  //循环发送数据,直到文件结尾
  char buffer[BUF_SIZE] = { 0 };  //缓冲区
  int nCount;
  while ((nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0){
    send(clntSock, buffer, nCount, 0);
  }
  shutdown(clntSock, SD_SEND);  //文件读取完毕,断开输出流,向客户端发送FIN包
  recv(clntSock, buffer, BUF_SIZE, 0);  //阻塞,等待客户端接收完毕
  fclose(fp);
  closesocket(clntSock);
  closesocket(servSock);
  WSACleanup();
  system("pause");
  return 0;
}

文件传输

//client
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 1024
int main(){
  //先输入文件名,看文件是否能创建成功
  char filename[100] = { 0 };  //文件名
  printf("Input filename to save: ");
  gets(filename);
  FILE *fp = fopen(filename, "wb");  //以二进制方式打开(创建)文件
  if (fp == NULL){
    printf("Cannot open file, press any key to exit!\n");
    system("pause");
    exit(0);
  }
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  struct sockaddr_in sockAddr;
  memset(&sockAddr, 0, sizeof(sockAddr));
  sockAddr.sin_family = PF_INET;
  sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  sockAddr.sin_port = htons(1234);
  connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
  //循环接收数据,直到文件传输完毕
  char buffer[BUF_SIZE] = { 0 };  //文件缓冲区
  int nCount;
  while ((nCount = recv(sock, buffer, BUF_SIZE, 0)) > 0){
    fwrite(buffer, nCount, 1, fp);
  }
  puts("File transfer success!");
  //文件接收完毕后直接关闭套接字,无需调用shutdown()
  fclose(fp);
  closesocket(sock);
  WSACleanup();
  system("pause");
  return 0;
}

755dae4a53b84c40aab02ee5807e6d8b.png

Windows操作系统之Socket通信

先启动server再启动client

//server.cpp
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 100
int main(){
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //创建套接字
  SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);
  //绑定套接字
  struct sockaddr_in sockAddr;
  memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
  sockAddr.sin_family = PF_INET;  //使用IPv4地址
  sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
  sockAddr.sin_port = htons(1234);  //端口
  bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
  //进入监听状态
  listen(servSock, 20);
  //接收客户端请求
  SOCKADDR clntAddr;
  int nSize = sizeof(SOCKADDR);
  char buffer[BUF_SIZE] = { 0 };  //缓冲区
  while (1){
    SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
    int strLen = recv(clntSock, buffer, BUF_SIZE, 0);  //接收客户端发来的数据
    send(clntSock, buffer, strLen, 0);  //将数据原样返回
    closesocket(clntSock);  //关闭套接字
    memset(buffer, 0, BUF_SIZE);  //重置缓冲区
  }
  //关闭套接字
  closesocket(servSock);
  //终止 DLL 的使用
  WSACleanup();
  return 0;
}
//client.cpp
#include <stdio.h>
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll
#define BUF_SIZE 100
int main(){
  //初始化DLL
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  //向服务器发起请求
  struct sockaddr_in sockAddr;
  memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
  sockAddr.sin_family = PF_INET;
  sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  sockAddr.sin_port = htons(1234);
  char bufSend[BUF_SIZE] = { 0 };
  char bufRecv[BUF_SIZE] = { 0 };
  while (1){
    //创建套接字
    SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    //获取用户输入的字符串并发送给服务器
    printf("Input a string: ");
    gets_s(bufSend);
    send(sock, bufSend, strlen(bufSend), 0);
    //接收服务器传回的数据
    recv(sock, bufRecv, BUF_SIZE, 0);
    //输出接收到的数据
    printf("Message form server: %s\n", bufRecv);
    memset(bufSend, 0, BUF_SIZE);  //重置缓冲区
    memset(bufRecv, 0, BUF_SIZE);  //重置缓冲区
    closesocket(sock);  //关闭套接字
  }
  WSACleanup();  //终止使用 DLL
  return 0;
}


相关文章
|
3月前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
136 1
|
1月前
|
Python
python socket 简单通信
python socket 简单通信
36 1
|
1月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
138 0
|
3月前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
323 10
|
3月前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
49 3
|
3月前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
39 1
|
3月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
79 0
|
3月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
81 0
|
14天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
1月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【8月更文挑战第27天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。