C/C++的网络编程基础(SOCKET)

zui

        最近浅浅的学习了一下网络编程,所以写这个文章。一方面起到对自己督促作用,另一方面也算是笔记吧!但是在开始前,你的系统需要是linux!

        那作为网络编程,自然是需要服务端和客户端。下面的代码会创建一个SOCKET并且在客户端可以向服务端发送消息。

服务端:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define Message "Message"
using namespace std;
string str;
int cnt = 0;
int main(int argc,char* argv[]){
    int listenfd = 0;
    listenfd = socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in SeverAddress;
    memset(&SeverAddress,0,sizeof(sockaddr_in));
    SeverAddress.sin_family = AF_INET;
    SeverAddress.sin_port = htons(atoi("5005"));
    SeverAddress.sin_addr.s_addr = htonl(INADDR_ANY);//指定任意IP
    //SeverAddress.sin_addr.s_addr = inet_addr("IP地址");//指定IP
    bind(listenfd,(sockaddr*) &SeverAddress,sizeof(SeverAddress));
    listen(listenfd,5);
    int clientfd = 0;
    sockaddr_in clientAddress;
    memset(&clientAddress,0,sizeof(sockaddr_in));
    int socklen = sizeof(sockaddr_in);
    clientfd = accept(listenfd,(sockaddr*) &clientAddress,(socklen_t*) &socklen);
    clog<<"from:"<>>"<

客户端:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
string str;
int main(int argc,char* argv[]){
    int sockfd = 0;
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    hostent* home;
    home = gethostbyname(argv[1]);//获取服务端的IP地址
    sockaddr_in Address;
    memset(&Address,0,sizeof(sockaddr_in));
    Address.sin_port = htons(atoi(argv[2]));//指定端口
    Address.sin_family = AF_INET;//制定协议
    memcpy(&Address.sin_addr,home->h_addr,home->h_length);
    connect(sockfd,(sockaddr*) &Address,sizeof(Address));/连接服务器
    char butter[1024];
    memset(butter,0,sizeof(butter));
    bool iret = true;
    while(iret != false){
        clog<<"input Message>>>";
        cin>>butter;
        iret = send(sockfd,butter,sizeof(butter),0);//接受信息
        str = butter;
        memset(butter,0,sizeof(butter));
    }
    close(sockfd);//关闭socket
    return 0;
}

效果如下:

[lemon@fedora src]$ ./main 
from:192.168.0.113
0 Message>>>Lemon
1 Message>>>Hello
2 Message>>>你好
3 Message>>>break
#服务端的结果
[lemon@fedora test]$ ./clienfd IP地址 5005
input Message>>>Lemon
input Message>>>Hello
input Message>>>你好
input Message>>>break
input Message>>>break
input Message>>>break
#客户端的操作,就是不知道为什么break要输入三遍

        不知道大家看到是怎样的,反正我刚开始觉得很乱。但是梳理一下会号很多。

 int socket(int domain, int type, int protocol);

        首先是socket函数,目的是创建一个用于通讯的通道。参数一般就是AF_INET、SOCK_ST REAM 、0。返回的是一个文件描述符,反正我是不明白,大家可以去搜索一下

Servaddr.sin_addr.s_addr = htonl(INADDR_ANY) //任意IP地址
Servaddr.sin_addr.s_addr = inet_addr("指定IP地址");

        这个很好理解,就是为服务器指定地址,就好比在网络中房子的地址。那有了房子,客人要访问就必须要知道你的门牌号(端口)

SeverAddress.sin_port = htons(atoi(端口));

        最后这个没什么好说的,就是选择协议,默认如下就好

SeverAddress.sin_family = AF_INET;
//其他的函数可以使用man查看,因为他们的参数比较好理解(主要是我比较懒)
//可以改变参数运行,查看程序的结果
//总之,希望这篇文章能对你有所帮助!

你可能感兴趣的:(c++,c语言,网络)