clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
时间: 2024-06-04 14:08:29 浏览: 16
这段代码是将字符串类型的IP地址"127.0.0.1"转换成网络字节序的32位二进制数,并赋值给结构体变量clientAddr的成员变量sin_addr.s_addr。这个结构体变量通常用于表示网络地址和端口号,用于创建和绑定套接字。在这个例子里,将127.0.0.1作为客户端的IP地址,用于本地回环测试。
相关问题
使用WINSOCK 通讯编写一个C/S通讯程序
好的,下面是一个简单的C/S通讯程序的代码示例,使用Winsock库进行通讯:
Server端代码:
```c
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接库文件
int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
SOCKADDR_IN serverAddr, clientAddr;
int clientAddrLen = sizeof(clientAddr);
int ret;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock.\n");
return 1;
}
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 绑定套接字到本地IP地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(8888);
ret = bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
if (ret == SOCKET_ERROR) {
printf("Failed to bind socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听客户端连接
ret = listen(serverSocket, 5);
if (ret == SOCKET_ERROR) {
printf("Failed to listen on socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Server started, waiting for client...\n");
// 等待客户端连接
clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET) {
printf("Failed to accept client.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Client connected: %s:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
// 接收客户端发送的数据
char recvBuf[1024];
int recvLen;
while (1) {
recvLen = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (recvLen <= 0) {
break;
}
printf("Received data from client: %s\n", recvBuf);
}
// 关闭套接字
closesocket(clientSocket);
closesocket(serverSocket);
// 卸载Winsock库
WSACleanup();
return 0;
}
```
Client端代码:
```c
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接库文件
int main() {
WSADATA wsaData;
SOCKET clientSocket;
SOCKADDR_IN serverAddr;
int ret;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock.\n");
return 1;
}
// 创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET) {
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 连接服务器
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(8888);
ret = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
if (ret == SOCKET_ERROR) {
printf("Failed to connect to server.\n");
closesocket(clientSocket);
WSACleanup();
return 1;
}
printf("Connected to server: %s:%d\n", inet_ntoa(serverAddr.sin_addr), ntohs(serverAddr.sin_port));
// 发送数据到服务器
char sendBuf[1024];
while (1) {
printf("Enter data to send: ");
gets_s(sendBuf, sizeof(sendBuf));
if (strlen(sendBuf) <= 0) {
break;
}
ret = send(clientSocket, sendBuf, strlen(sendBuf), 0);
if (ret == SOCKET_ERROR) {
printf("Failed to send data.\n");
closesocket(clientSocket);
WSACleanup();
return 1;
}
}
// 关闭套接字
closesocket(clientSocket);
// 卸载Winsock库
WSACleanup();
return 0;
}
```
注意事项:
1. 在编译时需要链接`ws2_32.lib`库文件;
2. 在使用`inet_addr`函数将IP地址转换为网络字节序时,需要注意将点分十进制形式的IP地址转换为整数后再调用`htonl`函数转换为网络字节序;
3. 代码中没有对输入进行安全处理,实际使用时需要注意输入合法性和缓冲区溢出等问题。
VC基于TCP 的网络聊天室代码
下面是一个基于TCP的简单聊天室的代码示例,使用C++编写,可以在Visual Studio中编译运行。
服务器端:
```c++
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
// 初始化Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "WSAStartup failed with error: " << iResult << endl;
return 1;
}
// 创建套接字
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET)
{
cout << "socket failed with error: " << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
// 绑定套接字
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(12345);
iResult = bind(listenSocket, (const sockaddr*)&addr, sizeof(addr));
if (iResult == SOCKET_ERROR)
{
cout << "bind failed with error: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
// 监听连接请求
iResult = listen(listenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR)
{
cout << "listen failed with error: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
cout << "Server started, listening on port 12345." << endl;
// 接受连接请求并处理客户端消息
SOCKET clientSocket;
sockaddr_in clientAddr;
int clientAddrSize = sizeof(clientAddr);
char recvBuf[1024];
while (true)
{
clientSocket = accept(listenSocket, (sockaddr*)&clientAddr, &clientAddrSize);
if (clientSocket == INVALID_SOCKET)
{
cout << "accept failed with error: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
cout << "Client connected, address: " << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << endl;
while (true)
{
iResult = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (iResult == SOCKET_ERROR)
{
cout << "recv failed with error: " << WSAGetLastError() << endl;
closesocket(clientSocket);
break;
}
else if (iResult == 0)
{
cout << "Client disconnected, address: " << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << endl;
closesocket(clientSocket);
break;
}
cout << "Received message from client (" << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << "): " << recvBuf << endl;
iResult = send(clientSocket, recvBuf, iResult, 0);
if (iResult == SOCKET_ERROR)
{
cout << "send failed with error: " << WSAGetLastError() << endl;
closesocket(clientSocket);
break;
}
}
}
closesocket(listenSocket);
WSACleanup();
return 0;
}
```
客户端:
```c++
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
// 初始化Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
cout << "WSAStartup failed with error: " << iResult << endl;
return 1;
}
// 创建套接字
SOCKET connectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (connectSocket == INVALID_SOCKET)
{
cout << "socket failed with error: " << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
// 连接服务器
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(12345);
iResult = connect(connectSocket, (const sockaddr*)&serverAddr, sizeof(serverAddr));
if (iResult == SOCKET_ERROR)
{
cout << "connect failed with error: " << WSAGetLastError() << endl;
closesocket(connectSocket);
WSACleanup();
return 1;
}
cout << "Connected to server, input 'exit' to quit." << endl;
// 发送消息给服务器
char sendBuf[1024];
while (true)
{
cin.getline(sendBuf, sizeof(sendBuf));
if (strcmp(sendBuf, "exit") == 0)
{
break;
}
iResult = send(connectSocket, sendBuf, strlen(sendBuf), 0);
if (iResult == SOCKET_ERROR)
{
cout << "send failed with error: " << WSAGetLastError() << endl;
closesocket(connectSocket);
WSACleanup();
return 1;
}
iResult = recv(connectSocket, sendBuf, sizeof(sendBuf), 0);
if (iResult == SOCKET_ERROR)
{
cout << "recv failed with error: " << WSAGetLastError() << endl;
closesocket(connectSocket);
WSACleanup();
return 1;
}
sendBuf[iResult] = '\0';
cout << "Received message from server: " << sendBuf << endl;
}
closesocket(connectSocket);
WSACleanup();
return 0;
}
```
运行客户端程序,输入任意消息即可将消息发送给服务器,服务器将收到消息并将其原样发送回客户端。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)