C

int socket(int domain, int type, int protocol)
domain : 建立的socket種類 AF_INET:IPv4, AF_INET6:IPv6
type : 資料傳輸手段 SOCK_STREAM:TCP, SOCK_DGRAM:UDP
protocol : 設定通訊協定的號碼,通常在寫 0 讓系統自動判定
建立失敗回傳 -1
struct sockaddr {
    unsigned short int sa_family; // 2 bytes
    char sa_data[14];             // 14 bytes
};
struct sockaddr_in {
    unsigned short int sin_family; // 2 bytes
    unsigned short int sin_port;   // 2 bytes
    struct in_addr sin_addr;       // 4 bytes
    unsigned char sin_zero[8];     // 填充,讓 sockaddr_in 的 size 跟 sockaddr 相同
};
int bind(int sockfd, struct sockaddr *addr, unsigned int addrlen)
socket 綁定到 prot 上
sockfd : socket() 回傳值
*addr : 要綁定的 socked 和 port 的描述結構,也可以用 sockaddr_in
addrlen : addr 的 size
int listen(int sockfd, int backlog);
sockfd : socket() 回傳值
backlog : 在client connect 被 server accept 前,允許 socket 申請 connect 的數量
錯誤時回傳-1
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
sockfd : socket() 回傳值
*restrict addr : 建立 TCP 連線的 client 資料
*restrict addrlen : addr 結構 size
回傳一個新的 sockfd
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 8888  //埠
#define BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};

    //建立TCP
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
		
		//綁定
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

		//監聽
    if (listen(server_fd, 3) < 0) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    printf("等待連接...\\n");

    //接受connect
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, 
		(socklen_t *)&addrlen)) < 0) {
        perror("accept failed");
        exit(EXIT_FAILURE);
    }

    printf("已連接\\n");

    //接收和發送資料
    while (1) {
        memset(buffer, 0, sizeof(buffer));
        if (recv(new_socket, buffer, BUFFER_SIZE, 0) <= 0)
            break;

        printf("接收到的訊息: %s\\n", buffer);

        //資料處理

        char *response = "C接收到來自PY的訊息";
        send(new_socket, response, strlen(response), 0);
    }

    printf("連接已關閉\\n");

    close(new_socket);
    close(server_fd);

    return 0;
}

PY

不斷輸入以傳送訊息,輸入exit則關閉連線

import socket

HOST = '127.0.0.1'  #IP地址
PORT = 8888  #埠

#連接
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))

while True:
    message = input("要傳送的文字:")
    
		#輸入exit則跳出
    if message == 'exit':
        break

    #發送
    client_socket.sendall(message.encode())   
    
    #接收
    data = client_socket.recv(1024)
    print('接收到的訊息:', data.decode())

#關閉
client_socket.close()

範例執行

Untitled