Linux网络编程之一个简单的socket程序

栏目: 服务器 · 发布时间: 7年前

内容简介:我们从一个简单的“Hello World!”程序切入 socket 编程。本节演示了 Linux 下的代码,server.cpp 是服务器端代码,client.cpp 是客户端代码,要实现的功能是:客户端从服务器读取一个字符串并打印出来。服务器端代码 server.cpp:

我们从一个简单的“Hello World!”程序切入 socket 编程。

本节演示了 Linux 下的代码,server.cpp 是服务器端代码,client.cpp 是客户端代码,要实现的功能是:客户端从服务器读取一个字符串并打印出来。

服务器端代码 server.cpp:

#include

#include

#include

#include

#include

#include

#include

int main(){

//创建套接字

int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

//将套接字和IP、端口绑定

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充

serv_addr.sin_family = AF_INET;  //使用IPv4地址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址

serv_addr.sin_port = htons(1234);  //端口

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

//进入监听状态,等待用户发起请求

listen(serv_sock, 20);

//接收客户端请求

struct sockaddr_in clnt_addr;

socklen_t clnt_addr_size = sizeof(clnt_addr);

int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

//向客户端发送数据

char str[] = "Hello World!Linux公社www.linuxidc.com";

write(clnt_sock, str, sizeof(str));

//关闭套接字

close(clnt_sock);

close(serv_sock);

return 0;

}

客户端代码 client.cpp:

#include

#include

#include

#include

#include

#include

int main(){

//创建套接字

int sock = socket(AF_INET, SOCK_STREAM, 0);

//向服务器(特定的IP和端口)发起请求

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充

serv_addr.sin_family = AF_INET;  //使用IPv4地址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址

serv_addr.sin_port = htons(1234);  //端口

connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

//读取服务器传回的数据

char buffer[40];

read(sock, buffer, sizeof(buffer)-1);

printf("来自服务器的消息: %s\n", buffer);

//关闭套接字

close(sock);

return 0;

}

先编译 server.cpp 并运行:

linuxidc@linuxidc:~/www.linuxidc.com$ g++ server.cpp -o server

linuxidc@linuxidc:~/www.linuxidc.com$

./server

Linux网络编程之一个简单的socket程序

正常情况下,程序运行到 accept() 函数就会被阻塞,等待客户端发起请求。

接下来编译 client.cpp 并运行:

linuxidc@linuxidc:~/www.linuxidc.com$ g++ client.cpp -o client

linuxidc@linuxidc:~/www.linuxidc.com$ ./client

来自服务器的消息: Hello World!Linux公社www.linuxidc.com

linuxidc@linuxidc:~/www.linuxidc.com$

Linux网络编程之一个简单的socket程序

client 运行后,通过 connect() 函数向 server 发起请求,处于监听状态的 server 被激活,执行 accept() 函数,接受客户端的请求,然后执行 write() 函数向 client 传回数据。client 接收到传回的数据后,connect() 就运行结束了,然后使用 read() 将数据读取出来。

需要注意的是:

1) server 只接受一次 client 请求,当 server 向 client 传回数据后,程序就运行结束了。如果想再次接收到服务器的数据,必须再次运行 server,所以这是一个非常简陋的 socket 程序,不能够一直接受客户端的请求。

2) 上面的源文件后缀为.cpp,是C++代码,所以要用g++命令来编译。

C++和 C语言 的一个重要区别是:在C语言中,变量必须在函数的开头定义;而在C++中,变量可以在函数的任何地方定义,使用更加灵活。这里之所以使用C++代码,是不希望在函数开头堆砌过多变量。

源码解析

1) 先说一下 server.cpp 中的代码。

第11行通过 socket() 函数创建了一个套接字,参数 AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用面向连接的数据传输方式,IPPROTO_TCP 表示使用 TCP 协议。在 Linux 中,socket 也是一种文件,有文件描述符,可以使用 write() / read() 函数进行 I/O 操作。

第19行通过 bind() 函数将套接字 serv_sock 与特定的IP地址和端口绑定,IP地址和端口都保存在 sockaddr_in 结构体中。

socket() 函数确定了套接字的各种属性,bind() 函数让套接字与特定的IP地址和端口对应起来,这样客户端才能连接到该套接字。

第22行让套接字处于被动监听状态。所谓被动监听,是指套接字一直处于“睡眠”中,直到客户端发起请求才会被“唤醒”。

第27行的 accept() 函数用来接收客户端的请求。程序一旦执行到 accept() 就会被阻塞(暂停运行),直到客户端发起请求。

第31行的 write() 函数用来向套接字文件中写入数据,也就是向客户端发送数据。

和普通文件一样,socket 在使用完毕后也要用 close() 关闭。

2) 再说一下 client.cpp 中的代码。client.cpp 中的代码和 server.cpp 中有一些区别。

第19行代码通过 connect() 向服务器发起请求,服务器的IP地址和端口号保存在 sockaddr_in 结构体中。直到服务器传回数据后,connect() 才运行结束。

第23行代码通过 read() 从套接字文件中读取数据。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-01/156365.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

XML Hacks

XML Hacks

Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95

Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具