c++Socket

1  写socket程序,链接器中应加入命令-lwsock32。

 

2

     #include

 

3

      套接字。

SOCKET RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

第一个参数决定IPv4,V6等,AF_INET是V4。

SOCK_DGRAM用于UDP,SOCK_STREAM用于TCP。

第三个参数是协议。

 

4

     地址格式。

sockaddr_in RecvAddr;

RecvAddr.sin_family = AF_INET;

RecvAddr.sin_port = htons(Port);

RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

 

5

int iResult = 0;

WSADATA wsaData;

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

第一个参数,说明版本是2.2。第二个参数,接受winsock实例的细节。

 

6

bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));

第一个参数是要绑定的socket。

第二个绑定的地址

第三个地址的长度

 

7

recvfrom(RecvSocket,RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);

一.套接字

二.Char* 要接收的字符串

三.Char[100] 则为100

四.……

五.传进来空指针即可。执行后,指针被赋值为发来数据源的细节。

六.地址的长度

 

8

sendto(SendSocket,SendBuf, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));

一.套接字

二.Char* 要发送的字符串

三.同上

四.……

五.要发送的地址

六.地址的长度。

 

9

closesocket(SendSocket);

WSACleanup();

 

server代码:


#include
#include
#include
#include

#include
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main()
{





int iResult = 0;

WSADATA wsaData;

SOCKET RecvSocket;
sockaddr_in RecvAddr;



char RecvBuf[1024];
int BufLen = 1024;

sockaddr_in SenderAddr;
int SenderAddrSize = sizeof (SenderAddr);

WSAStartup(MAKEWORD(2, 2), &wsaData);


RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(8000);
RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));

wprintf(L"Server is starting...n");
while(true)
{
recvfrom(RecvSocket,
RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
printf("%s said: %sn",inet_ntoa(SenderAddr.sin_addr),RecvBuf);
char TimeBuf[1024];
SYSTEMTIME sys;
GetLocalTime( &sys );
sprintf(TimeBuf,"M/d/d d:d:d.d 星期n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);


sendto(RecvSocket,TimeBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, sizeof (SenderAddr));

}

closesocket(RecvSocket);

//-----------------------------------------------
// Clean up and exit.
wprintf(L"Exiting.n");
WSACleanup();
return 0;
}

client代码:



#include
#include
#include
#pragma comment(lib, "Ws2_32.lib")

int main()
{


WSADATA wsaData;
SOCKET ClientSocket = INVALID_SOCKET;
sockaddr_in ClientAddr;
char SendBuf[1024];
char RecvBuf[1024];
int BufLen = 1024;
WSAStartup(MAKEWORD(2, 2), &wsaData);
ClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(6000);
ClientAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ClientSocket, (SOCKADDR *) & ClientAddr, sizeof (ClientAddr));
//---------------------------------------------------------------------------绑定

strcpy(SendBuf,"I want the time. ");
wprintf(L"Sending a datagram to the receiver...n");
sockaddr_in ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(8000);
ServerAddr.sin_addr.s_addr = inet_addr("192.168.1.100");

sendto(ClientSocket,SendBuf, BufLen, 0, (SOCKADDR *) & ServerAddr, sizeof (ServerAddr));
//----------------------------------------------------------------------------发送


sockaddr_in SenderAddr;
int SenderAddrSize=sizeof(SenderAddr);
recvfrom(ClientSocket,RecvBuf, BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
printf("%s said: %sn",inet_ntoa(SenderAddr.sin_addr),RecvBuf);
system("pause");
wprintf(L"Finished sending. Closing socket.n");
closesocket(ClientSocket);


wprintf(L"Exiting.n");
WSACleanup();
return 0;
}
### C++ Socket 编程使用指南及示例代码 在 C++ 中,Socket 编程是网络通信的核心技术之一。通过 Socket,程序可以实现客户端与服务端之间的数据交换。以下是关于 C++ Socket 编程的基本使用方法、常见问题解决以及示例代码的详细介绍。 #### 1. 基本概念 Socket 是一种通信机制,允许不同计算机上的进程通过网络进行通信。C++ 提供了丰富的 API 来支持 Socket 编程。常见的 Socket 类型包括流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。流式套接字通常用于 TCP 协议,而数据报套接字则用于 UDP 协议[^2]。 #### 2. 创建 Socket 的步骤 创建一个简单的 Socket 程序通常需要以下几个关键步骤: - 初始化 Winsock 库(仅限 Windows 平台)。 - 创建 Socket- 绑定地址和端口。 - 监听连接或发起连接。 - 数据收发。 - 关闭 Socket。 #### 3. 示例代码:TCP 服务端与客户端 以下是一个基于 TCP 协议的简单 C++ Socket 示例,分别展示服务端和客户端的实现。 ##### (1) TCP 服务端代码 ```cpp #include <iostream> #include <winsock2.h> // Windows 下需要包含此头文件 #pragma comment(lib, "ws2_32.lib") // 链接库 int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize" << std::endl; return -1; } SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == INVALID_SOCKET) { std::cerr << "Socket creation failed" << std::endl; WSACleanup(); return -1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080); // 设置端口号 serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "Bind failed with error" << std::endl; closesocket(serverSocket); WSACleanup(); return -1; } if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { std::cerr << "Listen failed with error" << std::endl; closesocket(serverSocket); WSACleanup(); return -1; } SOCKET clientSocket = accept(serverSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { std::cerr << "Accept failed with error" << std::endl; closesocket(serverSocket); WSACleanup(); return -1; } char recvBuf[512]; int bytesReceived = recv(clientSocket, recvBuf, 512, 0); if (bytesReceived > 0) { std::cout << "Message received: " << recvBuf << std::endl; } closesocket(clientSocket); closesocket(serverSocket); WSACleanup(); return 0; } ``` ##### (2) TCP 客户端代码 ```cpp #include <iostream> #include <winsock2.h> // Windows 下需要包含此头文件 #pragma comment(lib, "ws2_32.lib") // 链接库 int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize" << std::endl; return -1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { std::cerr << "Socket creation failed" << std::endl; WSACleanup(); return -1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080); // 设置目标端口号 inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr); if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "Connect failed with error" << std::endl; closesocket(clientSocket); WSACleanup(); return -1; } const char* sendBuf = "Hello from client!"; send(clientSocket, sendBuf, strlen(sendBuf), 0); closesocket(clientSocket); WSACleanup(); return 0; } ``` #### 4. 常见问题及解决方法 - **端口占用**:当尝试绑定一个已经被占用的端口时,会抛出“Address already in use”的错误。可以通过设置 `SO_REUSEADDR` 选项来避免此问题[^1]。 - **超时问题**:在网络通信中,可能会遇到连接或接收数据超时的情况。可以使用 `setsockopt` 函数设置超时时间。 - **并发处理**:对于高并发场景,建议使用多线程或多进程模型来处理多个客户端请求[^2]。 #### 5. 第三方库推荐 如果希望简化 Socket 编程流程,可以考虑使用第三方库,例如 `socket-cpp`,它提供了更高级别的封装和对 SSL/TLS 的支持[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值