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;
}
不斷輸入以傳送訊息,輸入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()
