`
lc52520
  • 浏览: 372399 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C++ Socket连接实现【转载】

阅读更多
C++ socket程序
下面是一个C++调用windows API实现有通信程序,您可以据此进行修改,封装成类.

// *******************************************************************
// client.cpp : Defines the entry point for the console application.
// *******************************************************************
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656

int main(int argc, char* argv[])
{
std::cout << "Start up tcp client." << std::endl;

WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 0);
if (0 != WSAStartup(sockVersion, &wsaData))
{
   std::cout << "Failed to retrive socket version."
    << std::endl;
   return 0;
}

SOCKET sock_client;
sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock_client)
{
   std::cout << "Invalid socket." << std::endl;
   WSACleanup();
   return 0;
}
sockaddr_in addr_sev;
addr_sev.sin_family = AF_INET;
addr_sev.sin_port = htons(PORT_SERVER);
addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1");
if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev)))
{
   std::cout << "Failed to connect." << std::endl;
   WSACleanup();
   return 0;
}
char buf[512];
int recv_size = 0;
recv_size = recv(sock_client, buf, 512, 0);
if (512 > recv_size)
{
   buf[recv_size] = '\0';
   std::cout << "receive data is :" << buf << std::endl;
   memset(buf, 0, sizeof(buf));
}
else
{
   std::cout << "receive data is overflow" << std::endl;
}
closesocket(sock_client);
WSACleanup();
system("PAUSE");
return 0;
}
 

// *******************************************************************
// server.cpp : Defines the entry point for the console application.
// *******************************************************************
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656
#define NUM_CLIENTS 10
int main(int argc, char* argv[])
{
std::cout << "Start up tcp server." << std::endl;

WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 0);
if (0 != WSAStartup(sockVersion, &wsaData))
{
   std::cout << "Failed to retrive socket version."
         << std::endl;
   return 0;
}
SOCKET sock_sev;
sock_sev = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock_sev)
{
   std::cout << "Invalid socket." << std::endl;
   WSACleanup();
   return 0;
}
sockaddr_in addr_sev;
addr_sev.sin_family = AF_INET;
addr_sev.sin_port = htons(PORT_SERVER);
addr_sev.sin_addr.s_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(sock_sev, (sockaddr *)&addr_sev, sizeof(addr_sev)))
{
   std::cout << "Failed to bind." << std::endl;
   WSACleanup();
   return 0;
}
if (SOCKET_ERROR == listen(sock_sev, NUM_CLIENTS))
{
   std::cout << "Failed to listen." << std::endl;
   WSACleanup();
   return 0;
}
// 多路复用,暂时还未实现.后期会对此给出示例.
//fd_set reads;
//fd_set writes;
//fd_set accepts;
//FD_ZERO(&reads);
//FD_ZERO(&writes);
//FD_ZERO(&accepts);
//SOCKET sock_client;
sockaddr_in addr_client;
int nAddrLen = sizeof(addr_client);
while (true)
{
   char tmp[512];
   sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);
  
   if (INVALID_SOCKET == sock_client)
   {
    std::cout << "Failed to accept." << std::endl;
    continue;
   }
   sprintf(tmp, "Your IP is %s\n", inet_ntoa(addr_client.sin_addr));
   send(sock_client, tmp, strlen(tmp), 0);
   std::cout << "Connection from " << inet_ntoa(addr_client.sin_addr)
         << std::endl;
   closesocket(sock_client);
}

return 0;
}
 
注:本程序使用的是VC6 IDE,编译时请在link中加入对ws2_32.lib库的引用.
分享到:
评论

相关推荐

    5种Socket模型实现源码

    Socket编程是计算机网络通信中的重要概念,特别是在C++和Visual C++(VC++)环境中,开发者经常使用Socket来实现客户端和服务器之间的数据交换。本文将深入探讨5种常见的Socket模型,以及它们在VC++环境下的实现源码...

    VC socket传送文件的例子(转载)

    标题"VC socket传送文件的例子(转载)"揭示了我们将讨论如何使用Visual C++(简称VC)通过Socket接口来实现文件的发送与接收。 首先,Socket是网络编程的基本组件,它提供了进程间通信(IPC)的接口,使得运行在...

    [转载] 多线程阻塞式网络编程socket_源代码

    5. 完成通信后,关闭Socket连接。 客户端则通常涉及建立连接、发送请求、接收响应和关闭连接等步骤。 综上所述,"多线程阻塞式网络编程socket"涉及到的技术主要包括Socket编程基础、多线程并发处理、阻塞式I/O模型...

    [转载]QQ示例源码(供学习C++网络编程参考)

    在C++中,这些操作可以通过`&lt;sys/socket.h&gt;`和`&lt;netinet/in.h&gt;`等头文件中的函数实现。 3. **TCP编程**:TCP提供面向连接的服务,确保数据的顺序和可靠性。在C++中,使用`socket()`函数创建套接字,`bind()`函数将...

    套接字编程学习套接字编程学习

    在实际应用中,服务器端还需要实现一个循环来持续监听和接受新的连接,并在每个连接上创建一个新的线程或使用异步I/O来处理客户端请求。此外,通常会添加错误处理和日志记录机制,以便在出现问题时进行调试。 总之...

    FastSocketLibrary.h [Version=1.0]

    介绍:DEV-C++上的快速套接字开启与连接;同时还搭载有其他扩展块,可以在很短的代码里实现多种功能。当然也可能会因为代码单一,无法实现自己的想法。但是没问题!FSL系列允许在原基础上进行修改,在保证原著作版权...

Global site tag (gtag.js) - Google Analytics