win下 socket基础实现(C++) 01
来源:互联网 发布:糊网络用语什么意思 编辑:程序博客网 时间:2024/06/05 10:33
本代码实现功能:
写一个socket 通讯的服务端和接收端,发送”Hi, I’m XM”,收到”I heard”,要求服务端和接收端都有显示信息
只提供完整代码,关于函数具体用法和作用还请移步其它博客,有很多。
服务端代码:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
//初始化WinSock服务
WSADATA WsaDat;
if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0)
{
cout << "WinSock服务初始化失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//创建套接字
SOCKET Socket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
cout << "创建套接字错误!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//主机名解析, 服务器不需要主动连接客户机
/*struct hostent *host;
if ((host = gethostbyname("localhost")) == NULL)
{
cout << "主机名解析失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}*/
//配置服务器地址结构信息
SOCKADDR_IN serverInf;
serverInf.sin_port = htons(8888);
serverInf.sin_family = AF_INET;
serverInf.sin_addr.s_addr = INADDR_ANY;
//连接服务器, 这就是服务器啊
/*if (connect(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0)
{
cout << "连接服务器失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//接受信息并显示
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int inDataLength = recv(Socket, buffer, 1024, 0);
cout << buffer;*/
if (bind(Socket, (SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR)
{
cout << "不能绑定地址信息到套接字\n";
WSACleanup();
system("PAUSE");
return 0;
}
listen(Socket, 1);
SOCKET TempSock = SOCKET_ERROR;
while (TempSock == SOCKET_ERROR)
{
cout << "服务器正在等待客户机连接...\n";
TempSock = accept(Socket, NULL, NULL);
}
Socket = TempSock;
cout << "有客户机已连接!\n";
char buffer_r[1024];
memset(buffer_r, 0, sizeof(buffer_r));
int inDataLength = recv(Socket, buffer_r, 1024, 0);
cout << "已接收:" << buffer_r << endl;
char *szMessage = "I heard!\n";
send(Socket, szMessage, strlen(szMessage),0);
cout << "已发送:I heard!" << endl;
//断开套接字连接, 不许发送但允许接收
shutdown(Socket, SD_SEND);
//关闭套接字, 释放资源
closesocket(Socket);
//guanbiWinSock服务, 清理
WSACleanup();
system("PAUSE");
return 0;
}
客户端代码:
#include <iostream>
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
//初始化WinSock服务
WSADATA WsaDat;
if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0)
{
cout << "WinSock服务初始化失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//创建套接字
SOCKET Socket = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
cout << "创建套接字错误!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//主机名解析
struct hostent *host;
if ((host = gethostbyname("localhost")) == NULL)
{
cout << "主机名解析失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//配置服务器地址结构信息
SOCKADDR_IN SockAddr;
SockAddr.sin_port = htons(8888);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long *)host -> h_addr);
//连接服务器
if (connect(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0)
{
cout << "连接服务器失败!\n";
WSACleanup();
system("PAUSE");
return 0;
}
//发送消息
char *s = "Hi, I'm XM!";
send(Socket, s, strlen(s), 0);
cout << "已发送:Hi, I'm XM!" << endl;
//接受信息并显示
char buffer_r[1024];
memset(buffer_r, 0, sizeof(buffer_r));
int inDataLength = recv(Socket, buffer_r, 1024, 0);
cout << "已接收:" << buffer_r;
//断开套接字连接, 不许发送但允许接收
shutdown(Socket, SD_SEND);
//关闭套接字, 释放资源
closesocket(Socket);
//关闭WinSock服务, 清理
WSACleanup();
system("PAUSE");
return 0;
}
- win下 socket基础实现(C++) 01
- win下 socket基础实现(C++) 02
- 基于Win Socket的网络编程基础
- windows下用c实现Socket通信
- Linux下C语言Socket实现文件传输
- Linux下Socket的实现(C++)
- win下gotoxy()函数实现
- Linux下基于C/C++的Socket编程基础
- Linux下基于C/C++的Socket编程基础
- Linux下基于C/C++的Socket编程基础
- Linux下基于C/C++的Socket编程基础
- Windows下C 用 Socket 发送图片--基础
- Windows下C 用 Socket 发送图片--基础
- c#socket编程基础
- c socket 基础
- c#socket 编程基础
- c#socket编程基础
- C#socket编程基础
- 成员变量和局部变量
- 窗体间传值
- redis 安装 以及php扩展安装
- Minimum Size Subarray Sum
- LintCode 比较字符串
- win下 socket基础实现(C++) 01
- 前端性能优化指南
- PDB文件:每个开发人员都必须知道的
- 12306订票系统好像不能用,不过用手机买到票了,嘿嘿
- 黑马程序员-----面向对象的特性封装、继承、多态、抽象
- 2015 ACM/ICPC Asia Regional Shenyang Online(1006)
- 同时支持三个MySQL+SQLite+PDO的PHP数据库类
- poj1611The Suspects(并查集)
- Android开发之Activity之间的通讯