Linux下的socket演示程序

7个月前 (04-27)
和C语言教程一样,我们从一个简单的“Hello World!”程序切入 socket 编程。

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

服务器端代码 server.cpp:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>

#include <netinet/in.h>

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[] = "http://c.biancheng网站站点" rel="nofollow" />

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>

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("Message form server: %s\n", buffer);

//关闭套接字

close(sock);

return 0;

}


启动一个终端(Shell),先编译 server.cpp 并运行:

[admin@localhost ~]$ g++ server.cpp -o server
[admin@localhost ~]$ ./server

#等待请求的到来

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

接下再启动一个终端,编译 client.cpp 并运行:

[admin@localhost ~]$ g++ client.cpp -o client
[admin@localhost ~]$ ./client

Message form server: http://c.biancheng网站站点" rel="nofollow" />