网络编程1
概述
参考书籍为《TCP/IP网络编程》,这个书写的比较基础,在看过很多参考书籍以后绝对这本适合用来作为网络编程的入门书籍。
本次初次编写简单的网络,直接把下面的代码自己敲一遍,然后跑起来就行,首先让自己有一个大概的了解即可。代码在Windows下VS2015运行。
服务端编写
#include <Winsock2.h>
#include <Ws2tcpip.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
void main()
{
//定义相关的数据
int iPort = 5050;
WSADATA wsaData;
SOCKET sListen, sAccept;
int iLen;
int iSend;
char buf[] = "I am a server";
struct sockaddr_in ser, cli;
std::cout << "----------------------------\n";
std::cout << "Server waitting\n";
std::cout << "----------------------------\n";
//启动winSocket
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cout << "Failed to load Winsock.\n";
return;
}
//创建Socket
sListen = socket(AF_INET, SOCK_STREAM, 0);
if (sListen == INVALID_SOCKET) {
std::cout << "socket() Failed:" << WSAGetLastError() <<"\n";
return;
}
//绑定IP地址
ser.sin_family = AF_INET;
ser.sin_port = htons(iPort);
ser.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR) {
std::cout << "bind() Failed\n";
return;
}
//监听
if (listen(sListen, 5) == SOCKET_ERROR) {
std::cout << "listen() Failed\n";
return;
}
//接受连接和发送欢迎信息
iLen = sizeof(cli);
while (true) {
sAccept = accept(sListen, (struct sockaddr*)&cli, &iLen);
if (sAccept == INVALID_SOCKET) {
std::cout << "accept() Failed\n";
break;
}
char clibuf[20] = { '\0' };
inet_ntop(AF_INET, (void*)&cli.sin_addr, clibuf, 16);
std::cout << "Accept client IP:" << clibuf << ":" << ntohs(cli.sin_port) << std::endl;
iSend = send(sAccept, buf, sizeof(buf), 0);
if (iSend == SOCKET_ERROR) {
std::cout << "send() Failed\n";
break;
}
else if (iSend == 0) {
break;
}
else {
std::cout << "Send byte:" << iSend << std::endl;
std::cout << "----------------------------------\n";
}
closesocket(sAccept);
}
closesocket(sListen);
WSACleanup();
}
客户端
#include <Winsock2.h>
#include <WS2tcpip.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
void main()
{
//定义相应的数据
WSADATA wsaData;
SOCKET sClient;
int iPort = 5050;
int iLen;
char buf[1024];
struct sockaddr_in ser;
//启动 winSocket
memset(buf, 0, sizeof(buf));
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cout << "Failed to load Winsock\n";
system("pause");
return;
}
//创建Socket
ser.sin_family = AF_INET;
ser.sin_port = htons(iPort);
char addr[20] = { '\0' };
std::cin >> addr;
inet_pton(AF_INET, addr, (void*)&ser.sin_addr.s_addr);
sClient = socket(AF_INET, SOCK_STREAM, 0);
if (sClient == INVALID_SOCKET) {
std::cout << "socket() Failed\n";
system("pause");
return;
}
//连接并进行简单的操作
if (connect(sClient, (struct sockaddr*)&ser, sizeof(ser)) == INVALID_SOCKET) {
std::cout << "connect() Failed\n";
system("pause");
return;
}
else {
iLen = recv(sClient, buf, sizeof(buf), 0);
if (iLen == 0) {
system("pause");
return;
}
else if (iLen == SOCKET_ERROR) {
std::cout << "recv() Failed\n";
system("pause");
return;
}
std::cout << "recv() data from server:" << buf << std::endl;
}
closesocket(sClient);
WSACleanup();
system("pause");
}
连接
先使用 CMD 启动 Windows shell,输入 ipconfig 查看 本地的 IP 地址,如果启动的客户端输入刚才的地址,就可以实现连接了