基于c++控制台的Socket通信源码

客户端socket去连服务器和一个特定端口,连接成功后即可进行通信,发送字符串。服务器socket绑定一个端口,然后等待客户机的接入,接收到客户端发送的数据后打印。

1.客户端代码如下:

// Demo2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>   
#include <string>   
#include <winsock2.h>   
#pragma comment(lib,"ws2_32.lib")   
using namespace std;   
  


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"客户端启动"<<endl;  

	//初始化winsock   
    WSADATA wsaD;   
    WSAStartup(MAKEWORD(1, 1), &wsaD);

    //创建客户端socket   
     SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   

    //连接服务器   
    struct sockaddr_in servaddr;   
    servaddr.sin_family = AF_INET;   
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //指定服务器   
    servaddr.sin_port = htons(8080);             //指定端口   
    cout<<"确实要建立连接? yes/no"<<endl; 

    char flag[4];   
    gets_s(flag);   
    if(strcmp(flag, "yes") == 0)   
    {   
		connect(sclient, (struct sockaddr*)&servaddr, sizeof(servaddr)); //通过套接字连接主机   
    }                    
              
    //发送数据   
    char buf[500];   
    cout<<"输入发送内容:";   
    while(cin.getline(buf, 500))   
    {   
		//通过套接字给主机发送字符串   
		send(sclient, buf, strlen(buf) + 1, 0);  //字符串还有个结束标志,     
    }
  
	return 0;
}

2.服务器代码如下:

// Demo3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>   
#include <string>   
#include <winsock2.h>   
#pragma comment(lib,"ws2_32.lib")   
using std::cout;   
using std::cin;   
using std::string;   
using std::endl; 


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"服务器启动!....."<<endl; 

    //初始化winsock   
    WSADATA wsaD;   
    WSAStartup(MAKEWORD(1, 1), &wsaD);

    //创建监听套接字   
	SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  

    // 绑定主机地址和监听套接字   
    struct sockaddr_in my_addr;   //主机地址   
    my_addr.sin_family = AF_INET;   
    my_addr.sin_port = htons(8080); //指定端口   
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);   
    bind(slisten, (struct sockaddr *)&my_addr, sizeof(my_addr)); 

    //启动监听   
    listen(slisten,5);   

    //开始接收数据   
    //struct sockaddr_in c_addr;  //客户地址   
    //int addr_len = sizeof(c_addr);   
    SOCKET sconnect = accept(slisten, NULL, NULL);//(struct sockaddr*)&c_addr, &addr_len); //通过监听套接字创建连接套接字   
    cout<<"连接已建立......"<<endl; 

    while(true)   
    {     
		char buf[500]; //存储接收的字符   
		int len = recv(sconnect, buf, sizeof(buf), 0);  //通过连接套接字接收数据   
		if(len > 0)   
        {   
			cout<<"客户说:"<<buf<<endl;   
        }   
    }   

	return 0;
}

(1)在创建socket之前要调用WSAStartup(MAKEWORD(1,1),&wsad);
这个函数说明使用的版本是1.1版的,wsad存储系统返回的winsocket信息。
 
(2)创建socket 调用socket(int af,int type,int protocol) af不清楚,type有SOCK_STREAM(tcp),SOCK_DGRAM(udp)
protocol :通信协议(默认为0)
 
(3)绑定端口,调用函数bind(SOCKET S,stuct sockaddr *name,int namelen),
S为监听socket,name为主机地址(里面指定了端口) ,namelen为地址变量长度。
 
(4)接下来使服务器处于监听状态,调用函数listen(SOCKET s,int backlog)
s为监听socket, backlog为最大连接数,最大为5.
 
(5)客户机连进来后就可通信了,但还要创建一个连接socket.调用accept(SOCKET S,struct sockaddr *addr int *addrlen);
s为监听socket,addr用来存放客户地址,addrlen为长度,然后返回连接socket.

这一步后就可以利用连接socket接收数据了,调用recv(SOCKET s,char *buf,int len,int flags).s为连接socket,buf来存放接收数据,他为一 个字符数组首地址。len为buf的最大长度,不是buf的实际长度,flags为此函数调用的方式。


参考---------

[1]:http://blog.sina.com.cn/s/blog_4bf793ad0100oz4w.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值