您的位置:首页 > 编程语言

Socket的使用实例,控制台上的编程。嗨!这里是服务端,您已连接成功!

2014-12-24 10:07 591 查看

//什么都不说了,直接上代码,本人使用Win7,VisualStudio2013C++控制台程序

#include "stdafx.h"

#include <Winsock2.h>

#include <iostream>

#include <string>

#pragma comment(lib,"ws2_32.lib")

using namespace std;

void main()

{

//========================================================

/*在开发的过程之中,如果你想要在应用程序中使用Socket的话,

你就必须先调用wsastartup函数。WSAStarup是windows网络编程接口软件下的一个命令,

只有学会灵活地使用WSAStarup,你才有可能编写出一个优秀的socket程序出来。*/

//========================================================

//wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,

//高阶字节指定小版本(修订本)号,低位字节指定主版本号

WORD wVersionRequested;

//WSAData 指向WSADATA数据结构的指针,这是提高程序运行速度所做的一个细小优化,

//一般都是用来接收winsock实现的细节

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1, 1); //高位字节存储副版本号, 低位字节存储主版本号

err = WSAStartup(wVersionRequested, &wsaData);//WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令

if (err != 0)

{

return;

}

//WSAStartup函数主要是初始化Winsock DLL,

//而WSACleanup()函数主要是为了解除Socket库的加载并且释放一定的资源。

//所以WSAStartup()函数和WSACleanup()函数是成对使用的。

if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)//高位字节和低位字节不正确

{

WSACleanup();

return;

}

//创建套接字

SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

//AF_INET:AddressFamily_INET,SOCK_DGRAM(UDP),后面那个0是protocol的值。

SOCKADDR_IN addrSrv; //服务端SOCKET

//SOCKADDR_IN和SOCKET类似,,用来专门标示TCP/IP协议下的地址结构的。

//下面三句初始化各种参数

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //填入本机IP地址

addrSrv.sin_family = AF_INET;

//addrSrv.sin_port = 0; //系统自动选择一个未占用的端口

addrSrv.sin_port = htons(2000); //端口号位2000

bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //将套接字绑定到端口上

SOCKADDR_IN addrClient; //客户端SOCKET

int len = sizeof(SOCKADDR);

char recvBuffer[300]; //接收字符数据

memset((void*)recvBuffer, '\0', 300);

cout << "等待对方发送数据... " << endl;

recvfrom(sockSrv, recvBuffer, 300, 0, (SOCKADDR*)&addrClient, &len);//接收客户端数据存储到recvBuffer

cout << "对方的IP地址为: " << inet_ntoa(addrClient.sin_addr) << endl; //输出客户端的地址

cout << "接收: " << recvBuffer << endl; //输出recvBuffer内容

string sendBuffer = "这里是服务器,您已连接成功!";

cout << "发送: " << sendBuffer.c_str()<< endl;

//下面是想客户端进行无连接的数据发送

sendto(sockSrv, sendBuffer.c_str(), sendBuffer.length() + 1, 0, (SOCKADDR*)&addrClient, sizeof(SOCKADDR));

closesocket(sockSrv); //关闭服务器套接字

WSACleanup(); //结束套接字库的调用

system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐