智慧的老鸟

一个程序员需要有一棵Gank的心,Dota能培养我。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在linux下开发自己的服务器客户端程序,我们追求一切程序从最小模型开始,就是最简单最容易扩展的一种应用框架。

习惯,我喜欢将自己需要g++的文件编写在sh文件中,每次,我只需要 sh g++.sh就ok了,在一切的可能情况下提高自己的工作效率。

linux客户端模型

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#define MAXLINE 100
#define SA struct sockaddr
#define SOCKET int

using namespace std;

const char *ip = {"127.0.0.1"};
const int port = 8124;

int main()
{
	cout << "this is a client!" << endl;
	cout << "conn server ip:" << ip << endl;
	cout << "conn server port:" << port << endl;

	SOCKET sockfd;
	if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{// 创建一个套接字,tcp协议,流套接字,通信协议
		perror("socket error");
		return -1;
	}
	struct sockaddr_in servaddr; // 通信地址类型变量
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(port);
	struct hostent *hp;
	hp = gethostbyname(ip);
	memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr, hp->h_length);

	if(connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) < 0) // 建立连接
	{
		perror("connect error");
		return -1;
	}

	cout << "YOU:" << endl;
	string message("hello nihao");
	//cin >> message;
	if(send(sockfd, message.c_str(), message.size(), 0) < 0) // 发送请求字符串
	{
		perror("send error");
		return -1;
	}

	int n;
	char recvline[MAXLINE+1];
	while((n = recv(sockfd, recvline, MAXLINE, 0)) > 0) // 接受,阻塞
	{
		recvline[n] = 0;
		cout << "recv from server: "<< recvline <<endl;
	}
	if(n < 0)
		perror("recv error");

	close(sockfd); // 关闭套接字连接

	return 0;	
}

 

linux客户端模型:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 100
#define SA struct sockaddr
#define SOCKET int

using namespace std;

int main()
{
    cout << "this is a server!" << endl;
    struct sockaddr_in server,client;

    SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0); // 创建监听套接字
    if(listen_sock < 0)
    {
        perror("socket error");
        return -1;
    }

    memset((char *)&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(8124);
    if(bind(listen_sock, (SA *)&server, sizeof(server)) < 0) // 绑定监听端口
    {
        perror("bind error");
        return -1;
    }

    listen(listen_sock, 5); // 监听 sockfd 一个已绑定未被连接的套接字描述符   backlog 队列
    
    socklen_t n = (socklen_t)sizeof(client);
    SOCKET conn_sock = (SOCKET)accept(listen_sock, (SA *)&client, &n); // 创建连接套接字
    if(conn_sock < 0)
        perror("accept error");
    else
    {
        // 接受client请求信息
        unsigned char buf[MAXLINE+1];
        memset(buf, 0, sizeof(buf));
        if((n = recv(conn_sock, buf, MAXLINE, 0)) < 0)
            perror("recv error");
        else
        {
            buf[n] = 0;
            cout << "recv from client : " << buf << endl;
        }
        // 服务器处理业务///
        //                ////
        //////////////////// 

        // 返回服务器处理结果字符串
        if(send(conn_sock, "server!", 7, 0) < 0)
            perror("send error");
    
        close(conn_sock);
    }
    close(listen_sock);
    return 0;    
}


你所需要的服务根据你的业务,进行扩展,这是服务器入门级别的代码哦。必须会。

posted on 2012-11-21 13:17  智慧的老鸟  阅读(655)  评论(0编辑  收藏  举报