返回

socket开发基本知识

闲谈

socket的本质与类型

socket是一种跨平台的应用程序接口,它允许应用程序通过网络进行通信。socket是一个抽象的概念,它代表了一个网络连接的端点,也就是一个网络地址和一个端口号。应用程序可以通过socket来发送和接收数据,就像使用一个普通的文件一样。

socket有两种主要类型:流式socket和数据报socket。流式socket用于传输连续的数据流,例如视频流或音频流。数据报socket用于传输单个的数据包,例如电子邮件或网页。

建立socket连接

要建立socket连接,需要经历以下几个步骤:

  1. 创建一个socket对象。
  2. 将socket对象绑定到一个本地网络地址和端口号。
  3. 将socket对象连接到远程网络地址和端口号。

socket编程步骤

编写socket程序时,通常需要经历以下几个步骤:

  1. 头文件。
  2. 初始化socket。
  3. 配置socket。
  4. 通信。
  5. 关闭socket。

socket编程常见陷阱

在socket编程时,需要注意以下几个常见陷阱:

  • 不要阻塞socket操作。
  • 不要使用未初始化的socket对象。
  • 不要在同一个socket上同时进行读写操作。
  • 不要关闭已经断开的socket。

实践案例:一个简单的socket服务器和客户端

为了加深对socket的理解,我们编写一个简单的socket服务器和客户端程序。

// socket服务器代码

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
  // 创建socket对象
  int server_socket = socket(AF_INET, SOCK_STREAM, 0);

  // 将socket对象绑定到本地网络地址和端口号
  struct sockaddr_in server_address;
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = INADDR_ANY;
  server_address.sin_port = htons(8080);
  bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address));

  // 监听socket连接
  listen(server_socket, 5);

  // 接受客户端连接
  int client_socket = accept(server_socket, NULL, NULL);

  // 与客户端通信
  char buffer[1024];
  recv(client_socket, buffer, sizeof(buffer), 0);
  send(client_socket, "Hello, world!", 13, 0);

  // 关闭socket连接
  close(client_socket);
  close(server_socket);

  return 0;
}

// socket客户端代码

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
  // 创建socket对象
  int client_socket = socket(AF_INET, SOCK_STREAM, 0);

  // 将socket对象连接到远程网络地址和端口号
  struct sockaddr_in server_address;
  server_address.sin_family = AF_INET;
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  server_address.sin_port = htons(8080);
  connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address));

  // 与服务器通信
  char buffer[1024];
  send(client_socket, "Hello, server!", 14, 0);
  recv(client_socket, buffer, sizeof(buffer), 0);

  // 关闭socket连接
  close(client_socket);

  return 0;
}