TCP Socket 核心流程
| 伺服器 | 客戶端 |
| socket() | socket() |
| bind() | bind() (可選,指定本地埠) |
| listen() | |
| accept() | connect() |
| recv/send | send/recv |
| close() | close() |
伺服器端完整碼
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define PORT 20000
#define BACKLOG 10
#define BUF_SIZE 255
#define WELCOME "Welcome to server. "
int main(void) {
int sfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr = {0}, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(PORT);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sfd, (struct sockaddr*)&saddr, sizeof(saddr));
listen(sfd, BACKLOG);
while (1) {
socklen_t len = sizeof(caddr);
int cfd = accept(sfd, (struct sockaddr*)&caddr, &len);
char buf[BUF_SIZE];
time_t now = time(NULL);
sprintf(buf, "%s%s", WELCOME, ctime(&now));
printf("Client: %s:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
send(cfd, buf, BUF_SIZE, 0);
close(cfd);
}
close(sfd);
return 0;
}
客戶端完整碼
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define PORT 20000
#define BUF_SIZE 255
int main(int argc, char *argv[]) {
if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); }
int sfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in saddr = {0};
saddr.sin_family = AF_INET;
saddr.sin_port = htons(PORT);
inet_aton(argv[1], &saddr.sin_addr);
connect(sfd, (struct sockaddr*)&saddr, sizeof(saddr));
char buf[BUF_SIZE];
recv(sfd, buf, BUF_SIZE, 0);
printf("Server: %s", buf);
close(sfd);
return 0;
}
關鍵函數說明
htons/htonl:主機序轉網路序(大端序)
inet_aton/inet_ntoa:IP 字串與二進位互轉
bzero/memset:結構體清零
socklen_t:accept 長度參數型別
編譯執行
gcc server.c -o server
gcc client.c -o client
./server & # 背景執行伺服器
./client 127.0.0.1