C++ socket程序

news/2024/5/17 17:39:15 标签: socket, c++, server, stream, tcp, windows
转自 http://hereson.javaeye.com/blog/198771
下面是一个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库的引用.

http://www.niftyadmin.cn/n/1187010.html

相关文章

二叉树三种非递归遍历实现

二叉树三种非递归遍历实现http://mcs.sysu.edu.cn/user/longt/Article_1781| 浏览数(1022) | 评论数(0) | 2009-10-17继续回顾基础三种遍历的非递归实现要点&#xff1a;利用栈&#xff0c;把握好进栈顺序&#xff0c;做好标记。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~测试…

mysql条件插入

#新建表 create table t_user ( userNamevarchar(100), gender varchar(2) ) #带条件插入&#xff0c;如果表中没有userNamename1的记录&#xff0c;就插入&#xff0c;否则就不插入 insert into t_userselect name1,Mfrom DUALwhere not exists( select userName #这里是sele…

有了malloc/free为什么还要new/delete?

来自: http://hi.baidu.com/sppeivan/blog/item/3041ca0e7c3d39206059f3ba.html malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言&#xff0c;光用maloc/free无法满足动态对象的要…

Find out with my performance review of the nike pg 1

The Nike PG 1 makes Paul George the fourth Nike Basketball signature athlete to receive his own sneaker. It features a forefoot Zoom Air unit, a full-length Phylon foam midsole, and it’s priced at $110. Is that enough to get the PG 1 into your gym bag? F…

林 锐《大学十年 —— 一个程序员的历程》值得成功和欲成功的朋友品读(转载)(上)

林 锐《大学十年》【作者介绍】 linrui  林锐&#xff0c;2000年获浙江大学计算机应用博士学位。大学期间两度被评为中国百名跨世纪优秀大学生&#xff0c;199/6年获电子工业部科技进步二等奖&#xff0c;1997年获首届中国大学生电脑大赛软件展示一等奖。2000年7月加入上海贝…

利用统计进行中文分词与词性分析

今天&#xff0c;翻出了我以前在本科阶段写的一些论文&#xff0c;虽然有几篇没有发表。突然发现很多还是比较实用&#xff0c;虽然学术价值并不是很大&#xff0c;于是我重新整理了下&#xff0c;用最简单的方式&#xff0c;摘要了部分出来拼成此文&#xff0c;当然拼的原料都…

【转】MVC之 自定义过滤器(ActionFilterAttribute)

原文地址&#xff1a;https://www.cnblogs.com/hnsongbiao/p/8717553.html阅读目录一、自定义Filter二、带参数的自定义Filter三、全局过滤器 回到目录一、自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类&#xff0c;重写其中需要的方法&#xff0c;来看下Act…

林 锐《大学十年 —— 一个程序员的历程》值得成功和欲成功的朋友品读(转载)(下)

1997年11月&#xff0c;在穷得快挨饿的时候&#xff0c;我获得了中国大学生跨世纪发展基金特等奖&#xff08;全国共20名&#xff0c;奖金1万元&#xff09;&#xff0c;到人民大会堂领奖。给我们出钱的是一个靠资本运作发财的集团&#xff0c;在宴会前&#xff0c;该集团领导人…